YSupport
YSupport
is a common support library for Y* gems (y_petri
, yzz
,
y_nelson
, sy
...). At the moment, it is a collection of all and sundry
helpful methods, which can be divided as follows
-
NameMagic
(lib/name_magic.rb
) -- its main feature is that it allows constant magic so well known from Ruby classes (Foo = Class.new; Foo.name #=> "Foo"
) to work with any objects. - Miscellaneous helpful methods (
lib/misc.rb
) - Typing (runtime assertions,
lib/typing.rb
) - Other smaller components:
-
unicode.rb
-- shortcut letter for class (ç), singleton class (ⓒ) etc. null_object.rb
-
try.rb
-- a different kind of#try
method - several other small fry components
-
NameMagic
Ruby classes are well known for their "constant magic": When they are assigned
to constants, they acquire name
attribute corresponding to the constant name.
x = Class.new
x.name #=> nil
Foo = x
x.name #=> "Foo"
NameMagic mixin lends this feature to any Ruby class. The class in which NameMagic is mixed in will also hold the registry of the instances, named or unnamed. Example code:
require 'y_support/name_magic'
class Animal
include NameMagic
def sound; "squeak" end
def speak; 2.times { puts sound.capitalize << ?! } end
end
class Dog < Animal; def sound; "bark" end end
class Cat < Animal; def sound; "meow" end end
Pochi = Dog.new
anonymous_kitten = Cat.new
Mixin NameMagic
makes class Animal
keep registry of its instances:
Animal.instances.names
#=> [:Pochi, nil]
Tama = anonymous_kitten
Animal.instances.names
#=> [:Pochi, :Tama]
# Name can also be supplied to the constructor explicitly:
Animal.new name: :Cheburashka
Animal.instance( "Cheburashka" )
Animal.instance( "Cheburashka" ).name
:Cheburashka
Animal.instances.names
#=> [:Pochi, :Tama, :Cheburashka]
Dog.instances.names
#=> [:Pochi]
Animal.instances.each &:speak
Dog.instances.each &:speak
Cat.instances.each &:speak
The registry of instances is maintained by the namespace, so the instances can only be garbage collected after the namespace is garbage collected. If the user wants to enable this earlier, the namespace can be ordered to forget them:
Animal.forget_all_instances
Animal.instances
[]
Other components
Read the documentation of the individual methods.
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request