Mis primeros pensamientos son algo como esto:¿Cómo ejecuto el código antes y después de un método en una subclase?
class AbstractBuilder
attr_reader :time_taken
def build_with_timer
started_at = Time.now
build
@time_taken = Time.now - started_at
end
def build
raise 'Implement this method in a subclass'
end
end
class MyBuilder < AbstractBuilder
def build
sleep(5)
end
end
builder = MyBuilder.new.build_with_timer
puts builder.time_taken
Sospecho que hay una manera mejor que ofrece una mayor flexibilidad, por ejemplo Idealmente me gustaría llamar a 'construir' en una instancia de MyBuilder en lugar de 'build_with_timer' y siempre se registra el tiempo de ejecución.
Consideré usar alias_method desde inicializar o incluso usar un módulo mixin en lugar de herencia de clase que anularía el método de compilación al llamar a super en el medio (no estoy seguro si eso funcionaría). Antes de bajar por el agujero del conejo, pensé que vería si hay una práctica establecida.
Para aclarar Quiero definir un método, de un nombre conocido, en una subclase que se envuelve de forma transparente (antes y después) con el código definido en la clase base. Necesito menos flexibilidad/sobrecarga que decir filtros ActiveRecord. – Kris
https://github.com/PragTob/after_do – Kris