使用Moose::Meta::Class->create
创建元类后,如何将该类作为元类实例化实际的Moose类?
(我还需要创建元类,因为我也想对它应用一些角色。)
答案 0 :(得分:3)
不确定这会在Building a Moose class at runtime and tuning it回答此问题或您的其他问题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?
,但请查看:
它可能会做你想要的。或者你可能会发现它对我们的工作很有用。
该文档确实提供了我在制作此模块时所做的博客文章的链接,因此您也可以找到有用的博客文章。
以下是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 /
答案 1 :(得分:3)
当然,元类就是这个类。如果您想要该类的实例,只需执行:
my $instance = $meta->name->new
您可能还需要确保$ meta不会过早收集。通常,您这样做:
$meta->add_method( meta => sub { $meta } );
这将保留元类,但如果你不小心的话,你会泄漏这个类。如果你只做一次,那没关系;如果你这样做了数千次,你可能会陷入麻烦。
更好地使用更高级别的内容,例如Moose::Meta::Class::create_anon_class
或MooseX::Traits
。