-1. Limitations (uniquement pour les packages)
La méthode EXPORTHOW appelle .set_how sur le courant en $?LANG
ajoutant un argot à ce dernier.
Ensuite, il ajoute add_package_declarator au MAIN
$?LANG
qui ajoute une package_declarator
méthode à ses actions et à sa grammaire. C'est, je pense, le seul "argot dynamique" (dans World.nqp).
Si vous voulez écraser routine_declarator . Ensuite, vous devez écrire un argot imitant la chaîne que je viens de citer. Si vous acceptez de conserver le mot-clé method et de faire la signature automatique dans la classe, disons selon le nom de la méthode, voici un moyen:
Remarque: Un package est un conteneur (package, grammaire, module, rôle, savoir-faire, énumération, classe, sous-ensemble). Si vous mettez du code à l'intérieur comme une méthode, cela s'exécute (je viens de l'essayer):
0. Description (EXPORTATION)
J'utiliserais EXPORTHOW non documenté et DECLARE
dans un module car je n'ai pas trouvé de moyen avec Phaser . Apparemment, il est trop tard, même à BEGIN.
L'exemple que je donne est de décorer chaque méthode d'une classe (même 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. Exécutable
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. Sortie
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Sources