perl - 在 Moose 子例程中,$meta 是如何进入 @_ 的?

标签 perl moose

chromatic's recent blog让我对 Moose 子程序感到好奇 has .我正在查看 Moose 源代码,并注意到 has子程序,有一个$meta@_ 解压的变量. $meta 在哪里来自?我已经开始涉足各种 Moose 和 Class::MOP 模块。在许多子例程中,似乎 $meta常见于 @_ 中的第一个参数,即使它没有作为参数专门传递给它。

编辑:这里是 has 的原始源代码子程序:

sub has {
    my $meta = shift;
    my $name = shift;

    Moose->throw_error('Usage: has \'name\' => ( key => value, ... )')
        if @_ % 2 == 1;

    my %options = ( definition_context => Moose::Util::_caller_info(), @_ );
    my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
    $meta->add_attribute( $_, %options ) for @$attrs;
}

最佳答案

您正在寻找的特殊魔法在 Moose::Exporter .你得到 has此代码中通过 Moose.pm 的方法:

Moose::Exporter->setup_import_methods(
    with_meta => [
        qw( extends with has before after around override augment )
    ],
    as_is => [
        qw( super inner ),
        \&Carp::confess,
        \&Scalar::Util::blessed,
    ],
);

注意 setup_import_methods 的“with_meta”选项-- 它以确保传递的第一个参数是元类对象的方式将这些方法导入调用者的命名空间。

扩展 Moose 的各种 MooseX 模块使用 Moose::Exporter 将新符号导入调用者的命名空间。您可以从 Moose::Cookbook::Extending::Recipe1 开始在食谱中阅读有关此过程的更多信息。 .

关于perl - 在 Moose 子例程中,$meta 是如何进入 @_ 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167259/

相关文章:

windows - Perl 5.12 使用为 Perl 5.6 创建的 DLL 加载模块

windows - 如何为非方法工作创建继承的 AUTOLOAD?

xml - Perl XML 解析器

perl - 这些 JSON 命令有什么区别?

web-services - SOAP::Lite 是否可用于创建文档/文字 Web 服务?

perl - 在Moose中,如何通过一个方法调用设置多个默认值?

perl - 在 Moose 中,如何对 arrayref setter 进行 uniq?

Perl:修复 Moose 属性和类型强制转换问题

perl - 访问要在外部显式调用的包中的 Moose 对象

perl - MooseX::Method::Signatures 可以与非 Moose 类一起使用吗?