2011-02-11 9 views
12

Tengo una clase Moose que está destinada a ser subclasificada, y cada subclase tiene que implementar un método de "ejecución". Sin embargo, me gustaría poner aplicar un modificador de método al método de ejecución en mi clase, por lo que se aplica al método de ejecución en todas las subclases. Pero los modificadores de método no se conservan cuando se invalida un método. ¿Hay alguna forma de garantizar que todas las subclases de mi clase tengan mi modificador de método aplicado a sus métodos de ejecución?En Perl/Moose, ¿cómo puedo aplicar un modificador a un método en todas las subclases?

Ejemplo: En una superclase, tengo esto:

before execute => sub { 
    print "Before modifier is executing.\n" 
} 

Luego, en una subclase de que:

sub execute { 
    print "Execute method is running.\n" 
} 

Cuando se llama al método de ejecución, no dice nada acerca de el modificador "antes".

Respuesta

9

Esto es para lo que está hecho el modificador de método augment. Usted puede poner esto en su superclase:

sub execute { 
    print "This runs before the subclass code"; 
    inner(); 
    print "This runs after the subclass code"; 
} 

Y entonces, en lugar de permitir que sus subclases para anular execute directamente, que los tiene augment que:

augment 'execute' => sub { 
    print "This is the subclass method"; 
}; 

Básicamente se le da una funcionalidad que es igual que el around modificador, excepto con la relación padre/hijo modificada.

+2

Hmm. Olvidé mencionar que mi superclase en realidad hereda de otra clase que no es Moose y que espera que sus subclases declaren un método de ejecución, por lo que el aumento/interno no funcionará. Pero estoy de acuerdo en que esta es la solución en general. En cuanto a mi problema específico, descubrí que simplemente podía poner mi modificador en el método que * ejecuta * ejecutar, porque ese método nunca se redefine ni se anula en subclases. Así que supongo que esto será aceptado. –

+0

@Ryan Thompson, no lo he intentado, creo que podrías poner una clase de Moose casi vacía entre tus padres y tus hijos. Luego ponga el método de ejecución 'hobbs' en su clase de adaptador Moose, herede todo lo demás, y listo. ** Advertencia: divagaciones no probadas, no probadas, mal pensadas de una persona atontada: úselo con extrema precaución. ** – daotoad

+1

@Ryan pero la superclase * no * declara un método de ejecución y * es * una subclase de la clase que espera sus subclases para declarar un método de ejecución, entonces todo es kosher con aumento/interno. Donde en el árbol se agrega realmente el método * debe * ser irrelevante. – hobbs

Cuestiones relacionadas