Module: DSLKit::Deflect

Extended by:
ThreadLocal
Included in:
Object
Defined in:
lib/dslkit/polite.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)


481
482
483
# File 'lib/dslkit/polite.rb', line 481

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.



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.

Returns:

  • (Boolean)


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