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)


400
401
402
# File 'lib/tins/dslkit.rb', line 400

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.



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.

Returns:

  • (Boolean)


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