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.
413 414 415 416 417 418 419 420 421 422 |
# 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 |
#deflect?(from, id) ⇒ Boolean
Return true if method id is deflected from class from, otherwise return false.
406 407 408 |
# File 'lib/tins/dslkit.rb', line 406 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.
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
# 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 |
#deflect_stop(from, id) ⇒ Object
Stop deflection method calls named id to class from.
425 426 427 428 429 430 431 |
# 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 |