我使用Moo作为我的OO引擎,并且我想在运行时改变一些实例的行为。我需要添加新的方法并更改现有的方法。
对于Moo,这是可能的吗?如果没有,我如何才能做到这一点?
发布于 2013-06-11 21:25:11
您可以使用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无法通过包"Foo“在moo.pm第49行找到对象方法"m2”。
https://stackoverflow.com/questions/17037844
复制相似问题