module DSLKit::Deflect
def self.deflect?(from, id)
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)
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 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)
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)
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