-1. Ograniczenia (tylko w przypadku pakietów)
Metoda EXPORTHOW wywołuje .set_how na bieżąco, $?LANG
dodając do niego slang.
Następnie dodaje add_package_declarator do, MAIN
$?LANG
który dodaje package_declarator
metodę do swoich akcji i gramatyki. Myślę, że to jedyny „dynamiczny slang” (w World.nqp).
Jeśli chcesz zastąpić routine_declarator . Następnie musisz napisać slang imitujący właśnie cytowany łańcuch. Jeśli akceptujesz zachowanie słowa kluczowego metody i automatyczne podpisywanie w klasie, powiedzmy zgodnie z nazwą metody, oto sposób:
Uwaga: Pakiet jest kontenerem (pakiet, gramatyka, moduł, rola, know-how, wyliczanie, klasa, podzbiór). Jeśli wstawisz kod jak metodę, zostanie to wykonane (właśnie próbowałem):
0. Opis (EKSPORT)
Użyłbym nieudokumentowane EXPORTHOW oraz DECLARE
w module bo nie znaleźć sposób z Phaser . Najwyraźniej jest już za późno, nawet w BEGIN.
Daję przykład, że dekoruję każdą metodę w klasie (nawet 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. Plik wykonywalny
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. Wyjście
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Źródła