子类中的perl moose触发器会破坏方法修饰符

时间:2012-09-11 06:33:38

标签: perl moose

我发现如果子类添加了一个触发器,那么基类中的方法修饰符就不会运行。这看起来像是一个驼鹿虫,或者至少是不直观的。这是我的例子:

package Foo {
    use Moose;

    has 'foo' => (
        is  => 'rw',
        isa => 'Str',
    );

    before 'foo' => sub {
        warn "before foo";
    };
};

package FooChild {

    use Moose;
    extends 'Foo';

    has '+foo' => ( trigger => \&my_trigger, );

    sub my_trigger {
        warn 'this is my_trigger';
    }
};

my $fc = FooChild->new();
$fc->foo(10);

如果运行此示例,则仅运行“this is my_trigger”warn,并忽略“before”修饰符。我正在使用Perl 5.14.2和Moose 2.0402。

这是正确的行为吗?这似乎不正确,特别是因为触发器将在触发器直接在基类中定义之前触发。

1 个答案:

答案 0 :(得分:4)

基于您不应该在类中区分继承的代码和代码的原则,我称之为错误。

添加到属性中删除方法修饰符似乎是一个普遍的问题。此代码演示了您的错误,不涉及触发器。

package Foo {
    use Moose;

    has 'foo' => (
        is  => 'rw',
        isa => 'Str',
        default => 5,
    );

    before 'foo' => sub {
        warn "before foo";
    };
};

package FooChild {

    use Moose;
    extends 'Foo';

    has '+foo' => ( default => 99 );
};

my $fc = FooChild->new();
print $fc->foo;

Please report this to the Moose folks