Ejecutar un método mixin al final de una definición de clase

Tengo un Mix-in que se refleja en la clase del receptor para generar algún código. Esto significa que necesito ejecutar el método de clase al final de la definición de la clase, como en este ejemplo trivialmente simplificado:

module PrintMethods module ClassMethods def print_methods puts instance_methods end end def self.included(receiver) receiver.extend ClassMethods end end class Tester include PrintMethods def method_that_needs_to_print end print_methods end 

Me gustaría que la mezcla hiciera esto por mí automáticamente, pero no puedo encontrar una manera. Mi primer pensamiento fue agregar receiver.print_methods a self.included en el mixin, pero eso no funcionará porque el método sobre el que quiero que se refleje aún no se ha declarado. Podría llamar a include PrintMethods al final de la clase, pero se siente como una mala forma.

¿Hay algún truco para que esto suceda, por lo que no necesito llamar a print_methods al final de la definición de la clase?

En primer lugar, no hay fin de definición de clase. Recuerde que en Ruby puede volver a abrir el método de clase Tester después de haberlo “inicializado”, por lo que el intérprete no puede saber dónde “termina” la clase.

La solución que puedo encontrar es hacer la clase a través de algún método auxiliar, como

 module PrintMethods module ClassMethods def print_methods puts instance_methods end end def self.included(receiver) receiver.extend ClassMethods end end class Object def create_class_and_print(&block) klass = Class.new(&block) klass.send :include, PrintMethods klass.print_methods klass end end Tester = create_class_and_print do def method_that_needs_to_print end end 

Pero ciertamente tener que definir clases de esta manera hace que me duelen los ojos.