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/