Я могу думать о двух подходах:
(1) Украсить методы Foo
, чтобы включить уведомление.
(2) Использовать прокси-объект, который перехватывает вызовы метода для Foo
и уведомляет вас, когда они происходят
Первое решение - это подход, использованный Jakub, хотя решение alias_method
не лучший способ достичь этого, используйте вместо этого:
def notify_when(meth)
orig_meth = instance_method(meth)
define_method(meth) do |*args, &block|
puts "#{meth} called"
orig_meth.bind(self).call *args, &block
end
end
Второе решение требует, чтобы вы использовали method_missing
в сочетании с прокси:
class Interceptor
def initialize(target)
@target = target
end
def method_missing(name, *args, &block)
if @target.respond_to?(name)
puts "about to run #{name}"
@target.send(name, *args, &block)
else
super
end
end
end
class Hello; def hello; puts "hello!"; end; end
i = Interceptor.new(Hello.new)
i.hello #=> "about to run hello"
#=> "hello!"
Первый метод требует изменения методов (то, что вы сказали, что вы не хотели), а второй метод требует использованияпрокси, может быть, вы чего-то не хотите.Простого решения нет, прости.