-1. Обмеження (лише для пакетів)
Метод EXPORTHOW викликає .set_how за поточним $?LANG
додаванням сленгу до останнього.
Потім він add_package_declarator до MAIN
$?LANG
якого додає package_declarator
метод до своїх дій та граматики. Це, я думаю, єдиний "динамічний сленг" (у World.nqp).
Якщо ви хочете, це перезаписати rutral_declarator . Тоді ви повинні написати сленг, що імітує щойно цитований ланцюг. Якщо ви погоджуєтесь зберегти ключове слово методу та зробити автоматичний підпис у класі, скажімо, відповідно до назви методу, ось такий спосіб:
Примітка: Пакет - це контейнер (пакет, граматика, модуль, роль, ноу-хау, перерахунок, клас, підмножина). Якщо ви помістите код всередину, як метод, він виконується (я просто спробував):
0. Опис (ЕКСПОРТ)
Я б використав незадокументований EXPORTHOW та DECLARE
в модулі, тому що не знайшов способу з Phaser . Мабуть, вже пізно навіть у BEGIN.
Я наводжу приклад - це декорування кожного методу в класі (навіть 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. Джерела