如何创建一个新的Moose类并在运行时实例化该类的对象?

时间:2010-03-10 07:11:06

标签: perl class runtime moose metaclass

使用Moose::Meta::Class->create创建元类后,如何将该类作为元类实例化实际的Moose类? (我还需要创建元类,因为我也想对它应用一些角色。)

2 个答案:

答案 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_classMooseX::Traits