1

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

4

2 回答 2

3

不确定这是否回答了在运行时构建 Moose 类并调整它的这个或您的其他 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?请查看:

它可能会做你想做的事。或者您可能会发现查看我们的 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/

于 2010-03-10T12:39:32.600 回答
3

当然,元类就是类。如果您想要该类的实例,只需执行以下操作:

my $instance = $meta->name->new

您可能还需要确保不会过早收集 $meta。通常,您会这样做:

$meta->add_method( meta => sub { $meta } );

这将保留元类,但如果您不小心,您将泄漏该类。如果你只做一次,那没关系;如果你这样做数千次,你可能会让自己陷入困境。

最好使用更高级别的东西,比如Moose::Meta::Class::create_anon_classor MooseX::Traits

于 2010-03-10T14:44:12.477 回答