2011-02-11 4 views
12

J'ai une classe Moose destinée à être sous-classée, et chaque sous-classe doit implémenter une méthode "execute". Cependant, je voudrais appliquer un modificateur de méthode à la méthode execute de ma classe, afin qu'il s'applique à la méthode execute dans toutes les sous-classes. Mais les modificateurs de méthode ne sont pas conservés lorsqu'une méthode est surchargée. Est-il possible de s'assurer que mon modificateur de méthode est appliqué à toutes les sous-classes de ma classe?En Perl/Moose, comment puis-je appliquer un modificateur à une méthode dans toutes les sous-classes?

Exemple: Dans une superclasse, j'ai ceci:

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

Ensuite, dans une sous-classe de cette:

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

Lorsque la méthode d'exécution est appelée, elle ne dit rien au sujet le modificateur "avant".

Répondre

9

C'est ce à quoi sert le modificateur de la méthode augment. Vous pouvez mettre dans votre superclasse:

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

Et puis au lieu de laisser vos sous-classes de passer outre execute directement, vous les avez augment il:

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

Fondamentalement, il vous offre des fonctionnalités qui est tout comme le around modificateur, sauf avec la relation parent/enfant modifiée.

+2

Hmm. J'ai oublié de mentionner que ma super-classe hérite réellement d'une autre classe non-Moose qui s'attend à ce que ses sous-classes déclarent une méthode d'exécution, donc augment/inner ne fonctionnera pas. Mais je suis d'accord que c'est la solution en général. En ce qui concerne mon problème spécifique, j'ai découvert que je pouvais simplement mettre mon modificateur sur la méthode que * appelle * execute, parce que cette méthode n'est jamais redéfinie ou surchargée dans les sous-classes. Donc je suppose que je vais mare cela comme accepté. –

+0

@Ryan Thompson, je n'ai pas essayé cela, je pense que vous pourriez mettre une classe Moose presque vide entre votre parent et les enfants. Ensuite, placez la méthode d'exécution 'hobbs' dans votre Moose-class, héritez de tout le reste, et voilà. ** Attention: divagations non testées, non testées et mal pensées d'une personne groggy - utilisez avec une extrême prudence. ** – daotoad

+1

@Ryan mais la superclasse * ne * déclare une méthode d'exécution et c'est * une * sous-classe de la classe qui attend ses sous-classes pour déclarer une méthode d'exécution, donc tout est kasher avec augment/inner. Où dans l'arbre la méthode est réellement ajoutée * devrait * être sans importance. – hobbs

Questions connexes