2011-02-11 4 views
12

Ho una classe Moose che deve essere sottoclasse e ogni sottoclasse deve implementare un metodo "execute". Tuttavia, vorrei mettere un metodo di modifica del metodo di esecuzione nella mia classe, in modo che si applica al metodo di esecuzione in tutte le sottoclassi. Ma i modificatori del metodo non vengono conservati quando un metodo viene sovrascritto. C'è un modo per garantire che tutte le sottoclassi della mia classe abbiano il mio modificatore di metodo applicato ai loro metodi di esecuzione?In Perl/Moose, come posso applicare un modificatore a un metodo in tutte le sottoclassi?

Esempio: in una superclasse, ho questo:

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

Poi, in una sottoclasse di che:

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

Quando il metodo execute viene chiamato, non dire nulla su il modificatore "prima".

risposta

9

Questo è il motivo del modificatore del metodo augment. Si può mettere questo nel vostro superclasse:

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

E poi invece di permettere vostre sottoclassi per ignorare execute direttamente, li avete augment esso:

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

Fondamentalmente ti dà la funzionalità che è proprio come il around modificatore, tranne con la relazione genitore/figlio modificata.

+2

Hmm. Ho dimenticato di menzionare che la mia superclasse in realtà eredita da un'altra classe non Moose che si aspetta che le sue sottoclassi dichiarino un metodo execute, quindi augment/inner non funzioneranno. Ma sono d'accordo che questa è la soluzione in generale. Per quanto riguarda il mio problema specifico, ho scoperto che potevo semplicemente mettere il mio modificatore sul metodo che * chiama * esegue, perché quel metodo non è mai ridefinito o sovrascritto in sottoclassi. Quindi immagino che lo caverò come accettato. –

+0

@Ryan Thompson, non ho provato questo, penso che potresti mettere una classe di Alce quasi vuota tra tuo genitore e figli. Quindi metti il ​​metodo di esecuzione 'hobbs' nella tua classe adattatore Moose, eredita tutto il resto ed ecco fatto. ** Attenzione: non testate, non sperimentate, sconvolgimenti vagamente pensati di una persona intontita - usare con estrema cautela. ** – daotoad

+1

@Ryan ma la superclasse * fa * dichiara un metodo di esecuzione e * è * una sottoclasse della classe che si aspetta le sue sottoclassi per dichiarare un metodo execute, quindi tutto è kosher con augment/inner. Nel punto in cui nell'albero il metodo viene effettivamente aggiunto * dovrebbe * essere irrilevante. – hobbs