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」修飾子は無視されます。私はMoose2.0402でPerl5.14.2を使用しています。

これは正しい動作ですか?特に、トリガーが基本クラスで直接定義されている場合、トリガーは前の後に起動するため、正しくないようです。

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;

これをムースの人々に報告してください

于 2012-09-11T07:15:30.410 に答える