2011-02-11 17 views
12

Mam klasy Moose, która ma być podklasy, a każda podklasa musi wdrożyć metodę "wykonaj". Chciałbym jednak zastosować modyfikator metody do metody execute w mojej klasie, tak aby dotyczyła ona metody execute we wszystkich podklasach. Modyfikatory metod nie są jednak zachowywane, gdy metoda jest nadpisywana. Czy istnieje sposób, aby upewnić się, że wszystkie podklasy mojej klasy będą miały mój modyfikator metody zastosowane do ich metod wykonywania?W języku Perl/Moose, w jaki sposób mogę zastosować modyfikator do metody we wszystkich podklasach?

Przykład: W nadrzędnej, mam to:

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

Następnie w podklasie, że:

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

Gdy metoda nazywa się wykonać, to nie powiedzieć nic na temat modyfikator "przed".

Odpowiedz

9

Oto, do czego służy modyfikator metody augment. Można umieścić to w nadrzędnej:

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

A potem zamiast pozwalając podklasy zastąpić execute bezpośrednio, trzeba im augment go:

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

Zasadniczo daje funkcjonalność, która jest podobnie jak around modyfikator, z wyjątkiem zmiany relacji nadrzędna/podrzędna.

+2

Hmm. Zapomniałem wspomnieć, że moja nadklasa faktycznie dziedziczy po innej klasie nie-Moose, która oczekuje, że jej podklasy będą deklarować metodę execute, więc augment/inner nie będzie działać. Ale zgadzam się, że to jest ogólne rozwiązanie. Jeśli chodzi o mój konkretny problem, okazało się, że mogę po prostu umieścić mój modyfikator na metodzie, która * wywołuje * execute, ponieważ ta metoda nigdy nie jest przedefiniowana lub przesłonięta w podklasach. Sądzę więc, że będę się z tym zgadzał. –

+0

@Ryan Thompson, Nie próbowałem tego, myślę, że możesz umieścić prawie pustą klasę Łosia między rodzicem a dziećmi. Następnie umieść metodę wykonywania "hobbs" w klasie adaptera Moose, dziedzicz wszystko inne i gotowe. ** Ostrzeżenie: niesprawdzone, niesprawdzone, źle przemyślane tarcia ospałej osoby - używaj z najwyższą ostrożnością. ** – daotoad

+1

@Ryan ale superklasa * nie * deklaruje metodę wykonania, a * jest * podklasą klasy, która oczekuje jego podklas do deklarowania metody wykonywania, więc wszystko jest koszerne z rozszerzeniem/wewnętrznym. Gdzie w drzewie metoda jest faktycznie dodana * powinna * być nieistotna. – hobbs

Powiązane problemy