class DynaMo::OverrideMethod

Attributes

context[R]
name[R]

Public Class Methods

new(context, name, &block) click to toggle source
# File lib/dyna_mo/override_method.rb, line 5
def initialize(context, name, &block)
  @context = context.to_sym
  @name = name.to_sym
  @override = block

  @mod = nil
end

Public Instance Methods

applied_module() click to toggle source
# File lib/dyna_mo/override_method.rb, line 13
def applied_module
  return @mod if @mod

  mod = Module.new
  mod.__send__(:define_method, @name, self.to_proc)
  @mod = mod
end
to_proc() click to toggle source
Calls superclass method
# File lib/dyna_mo/override_method.rb, line 21
def to_proc
  context = @context
  override = @override

  -> (*args) {
    Thread.current[:dynamo_contexts] ||= {}
    Thread.current[:dynamo_stack] ||= []

    if Thread.current[:dynamo_contexts][context]
      Thread.current[:dynamo_stack].push(-> (*args) { super(*args) })
      begin
        instance_exec(*args, &override)
      ensure
        Thread.current[:dynamo_stack].pop
      end
    else
      super(*args)
    end
  }
end