Я играю с функциями метапрограммирования Ruby, и мне это кажется немного странным. Я пытаюсь обернуть вызов метода с помощью модуля. В настоящее время я делаю следующее:
module Bar
module ClassMethods
def wrap(method)
class_eval do
old_method = "wrapped_#{method}".to_sym
unless respond_to? old_method
alias_method old_method, method
define_method method do |*args|
send old_method, *args
end
end
end
end
end
def self.included(base)
base.extend ClassMethods
end
end
class Foo
include Bar
def bar(arg = 'foo')
puts arg
end
wrap :bar
end
Три вопроса:
Есть ли способ сделать это без переименования метода, чтобы разрешить использование super
? Или что-то более чистое / короче?
Есть ли простой способ установить значения по умолчанию?
Есть ли способ переместить вызов wrap: bar
вверх?