Module: DSLKit::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.
494 495 496 497 498 499 500 501 502 503 |
# File 'lib/dslkit/polite.rb', line 494 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.
487 488 489 |
# File 'lib/dslkit/polite.rb', line 487 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.
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 |
# File 'lib/dslkit/polite.rb', line 461 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.
506 507 508 509 510 511 512 |
# File 'lib/dslkit/polite.rb', line 506 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 |