2012-09-11 30 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」警告運行時,與「前」修改器被忽略。我使用Perl 5.14.2和Moose 2.0402。

這是正確的行爲?這看起來不正確,尤其是因爲觸發器會在之前直接在基類中定義觸發器之後觸發。

回答

4

根據你不應該能夠區分類中的繼承代碼和代碼的原則,我會稱這是一個錯誤。

這似乎是一個常見問題,即添加到屬性中會刪除方法修飾符。這段代碼演示了你的bug,而不涉及觸發器。

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

好的,我在這裏添加了一個錯誤報告:https://rt.cpan.org/Public/Bug/Display.html?id = 79572。與此同時,我可以通過重複子類中的方法修飾符來解決這個問題。 – rrm1