Perl Moose子类中的触发器影响方法修改器。

5
我发现如果子类添加了触发器,则来自基类的方法修饰符不会运行。这似乎是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”警告,而“before”修饰符将被忽略。我正在使用Perl 5.14.2和Moose 2.0402。
这是正确的行为吗?这似乎不对,特别是当触发器直接在基类中定义时,触发器将在“before”之后触发。
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;

请向驼鹿团队报告此问题


好的,我在这里添加了一个错误报告:https://rt.cpan.org/Public/Bug/Display.html?id=79572。同时,我可以通过在子类中重复方法修饰符来解决它。 - rrm1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接