Module: Tins::Deflect
Overview
See examples/recipe.rb and examples/recipe2.rb how this works at the moment.
Defined Under Namespace
Classes: DeflectError, Deflector, DeflectorCollection
Constant Summary collapse
- @@sync =
Sync.new
Class Method Summary collapse
-
.deflect?(from, id) ⇒ Boolean
Return true if method id is deflected from class from, otherwise return false.
Instance Method Summary collapse
-
#deflect(from, id, deflector) ⇒ Object
Start deflecting method calls named id to the from class using the Deflector instance deflector.
-
#deflect?(from, id) ⇒ Boolean
Return true if method id is deflected from class from, otherwise return false.
-
#deflect_start(from, id, deflector) ⇒ Object
Start deflecting method calls named id to the from class using the Deflector instance deflector.
-
#deflect_stop(from, id) ⇒ Object
Stop deflection method calls named id to class from.
Methods included from ThreadLocal
instance_thread_local, thread_local
Class Method Details
Instance Method Details
#deflect(from, id, deflector) ⇒ Object
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.
441 442 443 444 445 446 447 448 449 450 |
# File 'lib/tins/dslkit.rb', line 441 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) ⇒ Boolean
Return true if method id is deflected from class from, otherwise return false.
434 435 436 |
# File 'lib/tins/dslkit.rb', line 434 def deflect?(from, id) Deflect.deflect?(from, id) end |
#deflect_start(from, id, deflector) ⇒ Object
Start deflecting method calls named id to the from class using the Deflector instance deflector.
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 |
# File 'lib/tins/dslkit.rb', line 408 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) ⇒ Object
Stop deflection method calls named id to class from.
453 454 455 456 457 458 459 |
# File 'lib/tins/dslkit.rb', line 453 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 |