У меня есть модуль с именем Notifier
.
module Notifier
def self.prepended(host_class)
host_class.extend(ClassMethods)
end
module ClassMethods
def emit_after(*methods)
methods.each do |method|
define_method(method) do |thing, block|
r = super(thing)
block.call
r
end
end
end
end
end
Он предоставляет метод класса emit_after
. Я использую это так:
class Player
prepend Notifier
attr_reader :inventory
emit_after :take
def take(thing)
# ...
end
end
Предполагается, что при вызове emit_after :take
модуль переопределяет #take
своим собственным методом.
Но метод экземпляра не переопределяется.
I может однако, переопределить его явно, не используя ClassMethods
module Notifier
def self.prepended(host_class)
define_method(:take) do |thing, block|
r = super(thing)
block.call
r
end
end
class Player
prepend Notifier
attr_reader :inventory
def take(thing)
# ...
end
end
#> @player.take @apple, -> { puts "Taking apple" }
#Taking apple
#=> #<Inventory:0x00007fe35f608a98...
Я знаю, что ClassMethods#emit_after
вызывается, поэтому я предполагаю, что метод определяется, но он никогда не вызывается.
Я хочу создавать методы динамически. Как я могу гарантировать, что метод generate переопределит мой метод экземпляра?