Estoy jugando con las funciones de metaprogramación de ruby, y me está resultando un poco complicado. Estoy tratando de ajustar una llamada a método usando un módulo. Actualmente, estoy haciendo esto:Ampliando un método de clase en un módulo
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
Tres preguntas:
¿Hay alguna manera de hacer esto sin cambiar el nombre del método, a fin de permitir el uso de
super
? O algo más limpio/más corto?¿Hay una forma clara de establecer los valores predeterminados?
¿Hay algún medio para mover la llamada
wrap :bar
más arriba?
En la vida real usaría la herencia de clase para eso. –
Yo también, pero estoy tratando de darle sentido a todo esto. :-) –
Relacionados: http://stackoverflow.com/questions/6631182/difference-between-class-eval-and-instance-eval-in-a-module –