EG is a small gem that lets you create objects based on a prototype instead of a
class definition. Eg is useful for creating singletons, mockups, service or
factory objects, or simply for writing simple scripts without resorting to the
class MyClass; ...; end; my_object = MyClass.new
dance.
require 'eg'
greeter = EG.(
greet: -> (name) { puts "Hello, #{name}!" }
)
greeter.greet('world')
$ gem install eg
Or add it to your Gemfile, you know the drill.
The EG module is a callable that accepts a single hash argument containing method prototypes and constant definitions. You can define methods, constants and instance variables:
o = EG.(
foo: -> { @bar },
'@bar': :baz,
VALUE: 42
)
o.foo #=> :baz
o::VALUE #=> 42
Any prototype key that does not begin with an upper-case letter or @
is
considered a method. If the value is a proc or responds to #to_proc
, it will
be used as the method body. Otherwise, EG will wrap the value in a proc that
returns it:
o = EG.(
foo: -> { :bar },
bar: :baz
)
o.foo #=> :bar
o.bar #=> :baz
Constants are defined using keys that begin with an upper-case letter:
o = EG.(
AnswerToEverything: 42
)
o::AnswerToEverything #=> 42
Care should be taken to always qualify constants when accessing them from
prototype methods by prefixing them with self::
:
o = EG.(
A: 1,
a: ->(x) { self::A + x }
)
o.a(2) #=> 3
Instance variables are defined using keys that begin with an @
:
o = EG.(
'@count': 0,
incr: -> { @count += 1 }
)
o.incr #=> 1
o.incr #=> 2