-1. Ограничения (только для пакетов)
Метод EXPORTHOW вызывает .set_how на текущем $?LANG
, добавляя к последнему сленг.
Тогда это add_package_declarator к MAIN
$?LANG
, который добавляет метод package_declarator
к его действиям и грамматике. Это, я думаю, единственный «динамический c сленг» (в World.nqp).
Если вы хотите перезаписать рутинный_декларатор . Затем вы должны написать сленг, имитирующий только что процитированную цепочку. Если вы согласны сохранить ключевое слово метода и сделать автоматическую c подпись в классе, скажем, в соответствии с именем метода, вот способ:
Примечание: Пакет представляет собой контейнер (пакет, грамматика, модуль, роль, ноу-хау, перечисление, класс, подмножество). Если вы помещаете код внутрь как метод, он выполняется (я только что попробовал):
0. Описание (EXPORTHOW)
Я бы использовал недокументированные EXPORTHOW и DECLARE
в модуле , потому что я не нашел пути с Phaser . Очевидно, уже слишком поздно, даже в НАЧАЛЕ.
Пример, который я привожу, - это декорирование каждого метода в классе (даже 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. Исполняемый файл
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. Вывод
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Источники