Module: ForwardTo
- Defined in:
- lib/forward_to.rb,
lib/forward_to/version.rb
Constant Summary collapse
- VERSION =
"0.4.0"
Instance Method Summary collapse
-
#attr_forward(target, *methods) ⇒ Object
List #forward_to but also an attr reader method for the member object:.
-
#forward_to(target, *methods) ⇒ Object
Forward methods to member object.
Instance Method Details
#attr_forward(target, *methods) ⇒ Object
List #forward_to but also an attr reader method for the member object:
include ForwardTo
class MyArray
attr_forward :implementation, :empty?, :size, :[]
def initialize(a = [])
@implementation = a
end
end
a = MyArray.new([1, 2, 3])
a.implementation # -> [1, 2, 3]
The target of #attr_reader should be an attribute
59 60 61 62 |
# File 'lib/forward_to.rb', line 59 def attr_forward(target, *methods) class_eval("attr_reader :#{target}") forward_to(target, *methods) end |
#forward_to(target, *methods) ⇒ Object
Forward methods to member object. The arguments should be strings or symbols
Forward to takes the first argument and creates methods for the rest of the arguments that forward their call to the first argument. Example
include ForwardTo
class MyArray
forward_to :@implementation, :empty?, :size, :[]
def initialize(a = [])
@implementation = a
end
end
a = MyArray.new
a.size # -> 0
a.empty? # -> true
a[0] = 1
a[0] # -> 1
The target of #forward_to can be an attribute or a member variable
29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/forward_to.rb', line 29 def forward_to(target, *methods) for method in Array(methods).flatten case method when /\[\]=/ class_eval("def #{method}(*args) #{target}&.#{method}(*args) end") when /=$/ class_eval("def #{method}(args) #{target}&.#{method}(args) end") else class_eval("def #{method}(*args, &block) #{target}&.#{method}(*args, &block) end") end end end |