【发布时间】:2011-01-25 18:51:29
【问题描述】:
在使用Moose::Meta::Class->create 创建元类后,如何将该类作为元类实例化一个真正的 Moose 类?
(我还需要创建元类,因为我还想为其应用一些角色。)
【问题讨论】:
标签: perl class runtime moose metaclass
在使用Moose::Meta::Class->create 创建元类后,如何将该类作为元类实例化一个真正的 Moose 类?
(我还需要创建元类,因为我还想为其应用一些角色。)
【问题讨论】:
标签: perl class runtime moose metaclass
当然,元类就是类。如果您想要该类的实例,只需执行以下操作:
my $instance = $meta->name->new
您可能还需要确保不会过早收集 $meta。通常,您会这样做:
$meta->add_method( meta => sub { $meta } );
这将保留元类,但如果你不小心,你会泄漏这个类。如果你只做一次,那没关系;如果您这样做数千次,您可能会陷入困境。
最好使用更高级别的东西,例如Moose::Meta::Class::create_anon_class 或MooseX::Traits。
【讨论】:
name 只是返回包/类的名称。这怎么不直观?见search.cpan.org/dist/Class-MOP/lib/Class/MOP/Package.pm
new_object。 search.cpan.org/~flora/Class-MOP-1.12/lib/Class/MOP/…
不确定这是否回答了此问题或您的其他 SO 问题 How do I build a Moose class at runtime, add a method to it, apply a role to it and instantiate it once? How would you approach this? Building a Moose class at runtime and tuning it,但请查看:
它可以做你想做的事。或者您可能会发现查看我们的 it 工作很有用。
文档确实提供了指向我在着手构建此模块时所做的博客文章的链接,因此您可能会发现这些文章也很有帮助。
这里是 MooseX::SingletonMethod 的简短代码示例:
{
package Foo;
use MooseX::SingletonMethod;
sub bar { say 'bar' }
}
my $baz = Foo->new;
my $bar = Foo->new;
$baz->add_singleton_method( baz => sub { say 'baz' } );
$baz->bar; # => bar
$bar->bar; # => bar
$baz->baz; # => baz
$bar->baz; # Throws can't find baz error
/I3az/
【讨论】: