module DSLKit::Deflect

def self.deflect?(from, id)

return false.
Return true if method _id_ is deflected from class _from_, otherwise
def self.deflect?(from, id)
  Deflect.deflecting && Deflect.deflecting.member?(from, id)
end

def deflect(from, id, deflector)

stop deflecting again.
Deflector instance deflector. After that yield to the given block and
Start deflecting method calls named _id_ to the _from_ class using the
def deflect(from, id, deflector)
  @@sync.synchronize do
    begin
      deflect_start(from, id, deflector)
      yield
    ensure
      deflect_stop(from, id)
    end
  end
end

def deflect?(from, id)

return false.
Return true if method _id_ is deflected from class _from_, otherwise
def deflect?(from, id)
  Deflect.deflect?(from, id)
end

def deflect_start(from, id, deflector)

Deflector instance deflector.
Start deflecting method calls named _id_ to the _from_ class using the
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

def deflect_stop(from, id)

Stop deflection method calls named _id_ to class _from_.
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