class Forwarder::Meta
I am the workerbee defining the methods and stuff
Attributes
arguments[R]
forwardee[R]
Public Class Methods
new(forwardee, arguments)
click to toggle source
# File lib/forwarder/meta.rb, line 101 def initialize forwardee, arguments @forwardee = forwardee @arguments = arguments end
Public Instance Methods
forward()
click to toggle source
TODO: Break AOP out of this so that we do not check @ runtime
# File lib/forwarder/meta.rb, line 8 def forward if arguments.before_with_block? forward_with_before_with_block elsif arguments.aop? forward_with_aop else forward_without_aop end end
forward_chain()
click to toggle source
# File lib/forwarder/meta.rb, line 18 def forward_chain a = arguments sr = symbolic_receiver forwardee.module_eval do define_method a.message do |*args, &blk| if a.before_with_block? args = Array(a.before.(*args,&blk)) if a.before_with_block? blk = args.pop elsif a.before? args = instance_exec( *args, &a.before ) end tgt = a.target.inject( self ){ |r, sym| sr.( r, sym ) } tgt.send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ).tap do | result | break a.after.( result ) if a.after? end #.send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ) end end end
forward_object()
click to toggle source
# File lib/forwarder/meta.rb, line 39 def forward_object a = arguments forwardee.module_eval do define_method a.message do |*args, &blk| args = instance_exec( *args, &a.before ) if a.before? a.object_target( self ) .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ).tap do | result | break instance_exec( result, &a.after ) if a.after? end end end end
Private Instance Methods
forward_with_aop()
click to toggle source
# File lib/forwarder/meta.rb, line 56 def forward_with_aop a = arguments sr = symbolic_receiver forwardee.module_eval do define_method a.message do |*args, &blk| args = instance_exec( *args, &a.before ) if a.before? sr .( self, a.target ) .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ).tap do | result | break instance_exec( result, &a.after ) if a.after? end end end end
forward_with_before_with_block()
click to toggle source
# File lib/forwarder/meta.rb, line 83 def forward_with_before_with_block a = arguments sr = symbolic_receiver forwardee.module_eval do define_method a.message do |*args, &blk| args = Array(a.before.(*args, &blk)) new_blk = args.pop sr .( self, a.target ) .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( new_blk ) ).tap do | result | break instance_exec( result, &a.after ) if a.after? end end end end
forward_without_aop()
click to toggle source
# File lib/forwarder/meta.rb, line 71 def forward_without_aop a = arguments sr = symbolic_receiver forwardee.module_eval do define_method a.message do |*args, &blk| sr .( self, a.target ) .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ) end end end
symbolic_receiver()
click to toggle source
# File lib/forwarder/meta.rb, line 106 def symbolic_receiver @__symbolic_receiver__ = ->(rec, sym) do case "#{sym}" when /\A@/ rec.instance_variable_get sym else rec.send sym end end end