module Tins::Deflect
See examples/recipe.rb and examples/recipe2.rb how this works at the moment.
Public Class Methods
Source
# File lib/tins/dslkit.rb, line 400 def self.deflect?(from, id) Deflect.deflecting && Deflect.deflecting.member?(from, id) end
Return true if method id is deflected from class from, otherwise return false.
Public Instance Methods
Source
# 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
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.
Source
# File lib/tins/dslkit.rb, line 406 def deflect?(from, id) Deflect.deflect?(from, id) end
Return true if method id is deflected from class from, otherwise return false.
Source
# 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
Start deflecting method calls named id to the from class using the Deflector
instance deflector.
Calls superclass method
Source
# 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
Stop deflection method calls named id to class from.