动态Moo对象方法发生变化

时间:2013-06-11 06:34:28

标签: perl oop moo

我使用Moo作为我的OO引擎,我想在运行时更改某些实例的行为。我需要添加新方法并更改现有方法。

Moo可以吗?如果没有,我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:2)

您可以使用Moo:Role执行此操作(有关详细信息,另请参阅Role::TinyClass::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.