Я создал модуль для перехвата методов перед вызовом метода в классе:
module Hooks
def self.included(base)
base.send :extend, ClassMethods
end
module ClassMethods
# everytime we add a method to the class we check if we must redifine it
def method_added(method)
if @hooker_before.present? && @methods_to_hook_before.include?(method)
hooked_method = instance_method(@hooker_before)
@methods_to_hook_before.each do |method_name|
begin
method_to_hook = instance_method(method_name)
rescue NameError => e
return
end
define_method(method_name) do |*args, &block|
hooked_method.bind(self).call
method_to_hook.bind(self).(*args, &block) ## your old code in the method of the class
end
end
end
end
def before(*methods_to_hooks, hookers)
@methods_to_hook_before = methods_to_hooks
@hooker_before = hookers[:call]
end
end
end
Я включил модуль в один из моих классов:
require_relative 'hooks'
class Block
include Indentation
include Hooks
attr_accessor :file, :indent
before :generate, call: :indent
# after :generate, call: :write_end
def initialize(file, indent=nil)
self.file = file
self.indent = indent
end
def generate
yield
end
end
этот блокclass является родительским для другого класса, который реализует свою собственную версию метода generate и который фактически реализован.
Когда мой код работает, method_added фактически вызывается с методом: генерировать как аргумент в каком-то бесконечном цикле.Я не могу понять, почему method_added пойман в этом бесконечном цикле.Вы знаете, что не так с этим кодом?Вот ссылка на полный код: ссылка на код на github