【发布时间】:2013-06-11 06:34:27
【问题描述】:
我使用 Moo 作为我的 OO 引擎,我想在运行时更改某些实例的行为。我需要添加新方法并更改现有方法。
Moo 有可能吗?如果没有,我该如何实现?
【问题讨论】:
-
我一直认为这是 Moo 和 Moose 之间的分界线。一旦你想开始摆弄你想要 Moose 的元对象。有趣的是,看看我是否错过了一些东西。
我使用 Moo 作为我的 OO 引擎,我想在运行时更改某些实例的行为。我需要添加新方法并更改现有方法。
Moo 有可能吗?如果没有,我该如何实现?
【问题讨论】:
您可以使用Moo:Role 执行此操作(有关详细信息,另请参阅Role::Tiny 和Class::Method::Modifiers)。例如:
use 5.10.1;
package Foo {
use Moo;
has a => ( is => 'rw' );
sub m1 { return "m1" }
}
package Foo::Role {
use Moo::Role;
sub m2 { return "m2" }
around 'm1' => sub {
# original Foo::m1
my $orig = shift;
return "wrapped: " . $orig->(@_);
}
}
use Role::Tiny;
my $foo = Foo->new;
say $foo->m1;
Role::Tiny->apply_roles_to_object( $foo, 'Foo::Role' );
say $foo->m2;
say $foo->m1;
my $boo = Foo->new;
say $boo->m1;
say $boo->m2;
你得到:
m1 m2 wrapped: m1 m1 Can't locate object method "m2" via package "Foo" at moo.pm line 49.
【讨论】: