-1. Limitaciones (solo para paquetes)
El método EXPORTHOW llama a .set_how en current $?LANG
agregando un argot a este último.
Luego agrega el paquete_declarador al MAIN
$?LANG
que agrega un package_declarator
método a sus acciones y gramática. Es, creo, la única "jerga dinámica" (en World.nqp).
Si lo que desea es sobrescribir rutina_declarador . Luego tienes que escribir una jerga que imite la cadena que acabamos de citar. Si acepta mantener la palabra clave del método y hacer la firma automática en la clase, digamos de acuerdo con el nombre del método, esta es una manera:
Nota: Un paquete es un contenedor (paquete, gramática, módulo, rol, knowhow, enumeración, clase, subconjunto). Si pones código dentro como un método, esto se ejecuta (lo acabo de probar):
0. Descripción (EXPORTHOW)
Usaría EXPORTHOW indocumentado y DECLARE
en un módulo porque no encontré una manera con Phaser . Aparentemente es demasiado tarde incluso en BEGIN.
El ejemplo que doy es decorar cada método en una clase (incluso 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. Ejecutable
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. Salida
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Fuentes