class FForwarder::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 146
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 101
def forward
  a = arguments
  sr = symbolic_receiver
  forwardee.module_eval do
    define_method a.message do |*args, &blk|
      args = a.before.(*args) if a.before?
      sr
        .( self, a.target )
        .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ).tap do | result |
          break a.after.( result ) if a.after?
        end
    end
  end
end
forward_chain() click to toggle source
# File lib/forwarder/meta.rb, line 116
def forward_chain
  a = arguments
  sr = symbolic_receiver
  forwardee.module_eval do
    define_method a.message do |*args, &blk|
      args = a.before.(*args) if a.before?
      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 131
def forward_object
  a = arguments
  forwardee.module_eval do
    define_method a.message do |*args, &blk|
      args = a.before.(*args) if a.before?
      a.object_target( self )
        .send( a.translation( a.message ), *a.complete_args(*args), &a.lambda( blk ) ).tap do | result |
          break a.after.( result ) if a.after?
        end
    end
  end
  
end

Private Instance Methods

symbolic_receiver() click to toggle source
# File lib/forwarder/meta.rb, line 151
def symbolic_receiver
  @__symbolic_receiver__ = ->(rec, sym) do
    case "#{sym}"
    when /\A@/
      rec.instance_variable_get sym
    else
      rec.send sym
    end 
  end
end