Module: Tins::Deflect

Extended by:
ThreadLocal
Included in:
Object
Defined in:
lib/tins/dslkit.rb

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

Instance Method Summary collapse

Methods included from ThreadLocal

instance_thread_local, thread_local

Class Method Details

.deflect?(from, id) ⇒ Boolean

Return true if method id is deflected from class from, otherwise return false.

Returns:

  • (Boolean)


693
694
695
# File 'lib/tins/dslkit.rb', line 693

def self.deflect?(from, id)
  Deflect.deflecting && Deflect.deflecting.member?(from, id)
end

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.

Returns:

  • (Boolean)


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