¿Es posible hacer esto funcionar, sin tener que incluir el módulo al final de la clase y simplemente incluirlo en la parte superior?¿Módulo para envolver un método de clase?
module VerboseJob
def self.included(job_class)
class << job_class
alias_method :original_perform, :perform
def perform(*args)
JobLogger.verbose { original_perform(*args) }
end
end
end
end
class HelloJob
include VerboseJob
def self.perform(arg1, arg2)
puts "Job invoked with #{arg1} and #{arg2}"
end
end
Lo que quiero que suceda, es para HelloJob.perform
a realidad invocan VerboseJob.perform
(que a su vez llama al método original dentro de un bloque). Debido a que el módulo aquí se incluye en la parte superior de la clase, esto no funciona, ya que perform
aún no está definido. Mover el include
hasta el final funciona, pero ¿hay alguna manera de que sea un poco más indulgente? Me gusta mantener todos los módulos incluidos en la parte superior de las definiciones de mi clase.
Estoy buscando algún método llamado en Module
o Class
cuando se ha cargado por completo, en lugar de como lo interpreta el tiempo de ejecución.
¿Por qué no usar 'method_added' para envolver' perform' cuando ... er .. added? :) –
No estoy seguro de entender tu significado, ¿no estoy haciendo eso? –
Tomé su respuesta (combinado con este http://pivotallabs.com/users/rolson/blog/articles/1162-redefine-a-method-from-a-module-like-a-gentleman) y se me ocurrió la más sucinto https://gist.github.com/1170661 (funciona sin importar dónde se haga el 'include'). Siéntase libre de editar su respuesta. Lo aceptaré de todos modos :) – d11wtq