class RKit::Override::Base

Attributes

method[RW]
method_name[RW]
pattern[RW]
receiver[RW]

Public Class Methods

new(method_name, method:, pattern:, pattern_args:, receiver:;) click to toggle source
# File lib/r_kit/override/base.rb, line 10
def initialize method_name, method:, pattern:, pattern_args:, receiver:;
  @method_name = method_name
  @method = method
  @pattern = RKit::Override::Pattern.build(pattern, *pattern_args)
  @receiver = receiver
end
override(*args) click to toggle source
# File lib/r_kit/override/base.rb, line 3
def self.override *args
  new(*args).override
end

Public Instance Methods

__newdef__() click to toggle source
# File lib/r_kit/override/base.rb, line 61
def __newdef__
  method
end
__olddef__() click to toggle source
# File lib/r_kit/override/base.rb, line 51
def __olddef__
  __olddef__ = receiver.instance_method(method_name)

  proc do |*args, &block|
    __olddef__.bind(self).call(*args, &block)
  end
rescue NameError
  Nodef.__nodef__(method_name)
end
override() click to toggle source
# File lib/r_kit/override/base.rb, line 17
def override
  override_method
  # TODO: hook_method
end

Protected Instance Methods

override_hook() click to toggle source
# File lib/r_kit/override/base.rb, line 121
          def override_hook

end
override_method() click to toggle source
# File lib/r_kit/override/base.rb, line 72
            def override_method
    oneself = self
    # override_binding = Module.new{
    #   define_method :__olddef__, oneself.__olddef__
    #   define_method :__newdef__, oneself.__newdef__
    #   define_method :override, oneself.pattern
    # }

    old_m = oneself.__olddef__
    new_m = oneself.__newdef__
    ove_m = oneself.pattern

    override_binding = proc{
      define_method :__olddef__, old_m
      define_method :__newdef__, new_m
      define_method :override, ove_m
    }

    # forget_binding = proc{
    #     remove_method :__olddef__
    #     remove_method :__newdef__
    #     remove_method :override
    #   }


    receiver.send :define_method, method_name do |*args, &block|

      #p self.singleton_class.included_modules
      #p

#      self.extend override_binding #unless self.singleton_class.include?(override_binding)
#  p "add"



      (class << self; self; end).instance_eval &override_binding


      closure = self.override *args, &block
      #closure = instance_eval(&ove_m)


#      p "delete"
#      (class << self; self; end).class_eval &forget_binding rescue nil
       closure

    end
  end