module Tins::Deflect

See examples/recipe.rb and examples/recipe2.rb how this works at the moment.

Public Class Methods

deflect?(from, id) click to toggle source

Return true if method id is deflected from class from, otherwise return false.

# File lib/tins/dslkit.rb, line 400
def self.deflect?(from, id)
  Deflect.deflecting && Deflect.deflecting.member?(from, id)
end

Public Instance Methods

deflect(from, id, deflector) { || ... } click to toggle source

Start deflecting method calls named id to the from class using the Deflector instance deflector. After that yield to the given block and stop deflecting again.

# File lib/tins/dslkit.rb, line 413
def deflect(from, id, deflector)
  @@sync.synchronize do
    begin
      deflect_start(from, id, deflector)
      yield
    ensure
      deflect_stop(from, id)
    end
  end
end
deflect?(from, id) click to toggle source

Return true if method id is deflected from class from, otherwise return false.

# File lib/tins/dslkit.rb, line 406
def deflect?(from, id)
  Deflect.deflect?(from, id)
end
deflect_start(from, id, deflector) click to toggle source

Start deflecting method calls named id to the from class using the Deflector instance deflector.

Calls superclass method
# File lib/tins/dslkit.rb, line 380
def deflect_start(from, id, deflector)
  @@sync.synchronize do
    Deflect.deflecting ||= DeflectorCollection.new
    Deflect.deflecting.member?(from, id) and
      raise DeflectError, "#{from}##{id} is already deflected"
    Deflect.deflecting.add(from, id, deflector)
    from.class_eval do
      define_method(id) do |*args|
        if Deflect.deflecting and d = Deflect.deflecting.find(self.class, id)
          d.call(self, id, *args)
        else
          super(*args)
        end
      end
    end
  end
end
deflect_stop(from, id) click to toggle source

Stop deflection method calls named id to class from.

# File lib/tins/dslkit.rb, line 425
def deflect_stop(from, id)
  @@sync.synchronize do
    Deflect.deflecting.delete(from, id) or
      raise DeflectError, "#{from}##{id} is not deflected from"
    from.instance_eval { remove_method id }
  end
end