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.
706 707 708 709 710 711 712 713 714 715 |
# File 'lib/tins/dslkit.rb', line 706 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.
699 700 701 |
# File 'lib/tins/dslkit.rb', line 699 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.
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 |
# File 'lib/tins/dslkit.rb', line 673 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.
718 719 720 721 722 723 724 |
# File 'lib/tins/dslkit.rb', line 718 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 |