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 384 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 397 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 390 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 364 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 409 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