5

我发现如果子类添加触发器,则基类中的方法修饰符不会运行。这似乎是一个 Moose bug,或者至少是不直观的。这是我的例子:

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”警告运行,“before”修饰符被忽略。我正在使用 Perl 5.14.2 和 Moose 2.0402。

这是正确的行为吗?这似乎不对,尤其是当触发器直接在基类中定义时,触发器将在之前触发。

4

1 回答 1

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;

请将此报告给 Moose 人

于 2012-09-11T07:15:30.410 回答