2012-09-11 5 views
5

サブクラスがトリガーを追加すると、基本クラスのメソッド修飾子が実行されないことがわかりました。これはムースバグ、または少なくとも直感的ではないようです。ここに私の例です:サブクラスの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); 

あなたはこの例を実行する場合は、唯一の「これはmy_triggerです」実行を警告し、修飾子は無視され、「前に」。私はMoose 2.0402でPerl 5.14.2を使用しています。

この動作は正しいですか?トリガがベースクラスに直接定義されている場合、トリガは前のトリガの後に起動するため、特にそうは思われません。

答えて

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

+0

[OK]を、私はここにバグレポートを追加:https://rt.cpan.org/Public/Bug/Display.html?id=79572。その間、私はそれを回避するために、私が想定しているサブクラスでメソッド修飾子を繰り返すことができます。 – rrm1

関連する問題