-1. Limitazioni (solo per i pacchetti)
Il metodo EXPORTHOW chiama .set_how al momento $?LANG
aggiungendo un gergo a quest'ultimo.
Quindi aggiunge_package_declarator al MAIN
$?LANG
quale aggiunge un package_declarator
metodo alle sue azioni e grammatica. È, credo, l'unico "gergo dinamico" (in World.nqp).
Se quello che vuoi è sovrascrivere routine_declarator . Quindi devi scrivere un gergo che imita la catena appena citata. Se accetti di mantenere la parola chiave del metodo e fai la firma automatica nella classe, ad esempio in base al nome del metodo, ecco un modo:
Nota: un pacchetto è un contenitore (pacchetto, grammatica, modulo, ruolo, know-how, enum, classe, sottoinsieme). Se inserisci il codice come un metodo, questo viene eseguito (l'ho appena provato):
0. Descrizione (EXPORTHOW)
Userei EXPORTHOW non documentato e DECLARE
in un modulo perché non ho trovato un modo con Phaser . Apparentemente è troppo tardi anche a BEGIN.
L'esempio che do, è decorare ogni metodo in una classe (anche BUILDALL
).
1. Lib ( decorator.rakumod
)
class DecoratedClassHOW is Metamodel::ClassHOW {
method add_method(Mu $obj, $name, $code_obj) {
sub wrapper ($obj, $a, $b) {
say "Before $name";
my $res = $code_obj($obj, $a, $b);
say "After $name";
return $res;
}
my $res = callwith($obj, $name, &wrapper);
return $res;
}
}
my module EXPORTHOW {
package DECLARE {
constant decorated = DecoratedClassHOW;
}
}
2. eseguibile
use lib '.';
use decorator-lib;
decorated Foo {
method abc($a, $b) {
say "In abc: $a:$b";
}
}
my $f = Foo.new;
$f.abc(1, 2);
3. Uscita
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Fonti