Как автоматически загрузить подпрограмму модуля? - PullRequest
0 голосов
/ 11 мая 2018

В Perl 5 модуль может объявить подпрограмму AUTOLOAD(), которая будет вызываться, если вызывается неопределенная подпрограмма.Аналогично в классах Perl 6 есть метод FALLBACK().Но я не смог найти ничего похожего на FALLBACK() для модулей.

Вот пример варианта использования: я хотел бы написать новый модуль MyModule, который экспортирует все подпрограммы, которые экспортирует другой модуль OtherModule, а затем перенаправляет все вызовы подпрограмм в эти экспортированные методы (нееще определено) в MyModule соответствующей подпрограмме в OtherModule.Я думаю, что я могу получить экспортированные символы из OtherModule, используя CompUnit::Util.

Вопрос : Как я могу реализовать механизм автозагрузки Perl 5 в Perl 6?

1 Ответ

0 голосов
/ 11 мая 2018

Лексические имена разрешены статически, поэтому я не уверен, как реализовать AUTOLOAD без некоторой глубокой магии.

Что касается вашего конкретного примера, я также не совсем уверен, каким будет «правильный» способ сделать это, но вот «грязное» решение, которое, кажется, работает, заменив подпрограмму &foo, экспортируемую модулем Foo * * 1006

# get all subroutines exported by Foo by default
BEGIN my @reex = do {
    use Foo;
    MY::.pairs.grep(*.key.starts-with('&'));
}

# export our replacement subroutine (also in the default namespace)
sub foo is export {
    say "new foo";
}

# re-export subroutines lacking a replacement
# placed at the end of the module so EXPORT will have been populated
BEGIN EXPORT::DEFAULT::{.key} //= .value
    for @reex;
...