【问题标题】:Import MooseX::Method::Signatures into caller's scope将 MooseX::Method::Signatures 导入调用者的作用域
【发布时间】:2010-09-05 21:33:41
【问题描述】:

我制作了一个“捆绑”模块,它做了很多事情:导入Moose、导入truenamespace::autoclean,使调用者的类不可变(取自MooseX::AutoImmute)。我无法弄清楚的一件事是如何包含MooseX::Method::Signatures

这是我目前所得到的:

package My::OO;

use Moose::Exporter;
use Hook::AfterRuntime;

use Moose ();
use true ();
use namespace::autoclean ();

my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods(
 also => ['Moose'],
);
sub import {
 true->import();

 my $caller = scalar caller;
 after_runtime { $caller->meta->make_immutable };

 namespace::autoclean->import(-cleanee => $caller);

 goto &$import;
}
sub unimport {
 goto &$unimport;
}

1;

想法是,在我的代码中,我现在可以执行以下操作:

package My::Class; {
    use My::OO;
    extends 'My::Parent';
    method foo() { ... }
}

但现在我仍然需要添加一个额外的use MooseX::Method::Signatures;。如何将其包含到我的 OO 模块中?

【问题讨论】:

    标签: perl import moose syntactic-sugar


    【解决方案1】:

    首先,请注意Hook::AfterRuntime 的实现非常脆弱。虽然它适用于许多简单的事情,但很容易以非常难以调试的错误告终。我建议您自己编写->meta->make_immutable,或者使用其他方法来绕过编写它,例如MooseX::Declare

    回答您的实际问题:

    MooseX::Method::Signatures->setup_for($your_caller);
    

    【讨论】:

    • +1 表示 MooseX::Declare!说真的,Moose 很酷,但如果要让 Perl OO 变得简单,那就一路走下去。例如,我正在开发一个名为 Opoly 的基于 Perl 的 *onopoly 克隆,我尝试的部分原因是在 MooseX::Declare 中完成了一个完整的项目,而且它很棒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多