2012-11-09 32 views
3

很酷的是,可以將它們添加到子類中或將它們混合到角色中。我的問題是,當子類重新定義方法本身(而不是修飾符)時,似乎來自基類的方法修飾符會停用。也許我正在理解方法修飾符錯誤。例如:基類中的Moose方法修飾符不會被調用

use feature 'say'; 

package Foo; 
use Moose; 

has called => (is => 'rw', isa => 'Bool', default => 0); 
sub call { 'Foo called' } 
after call => sub { shift->called(1) }; 

my $foo = Foo->new(); 
say $foo->called; # 0 
say $foo->call;  # Foo called 
say $foo->called; # 1 

package Bar; 
use Moose; 
extends 'Foo'; 

sub call { 'Bar called' } 

my $bar = Bar->new(); 
say $bar->called; # 0 
say $bar->call;  # Bar called 
say $bar->called; # 0 

我希望最後的輸出爲1$foo。我究竟做錯了什麼?

+2

看起來像:http://stackoverflow.com/questions/4965197/in -perl-moose-how-can-i-apply-a-modifier-to-a-method-in-all-subclasses – RobEarl

+0

謝謝@RobEarl,一定會看看! :) – memowe

回答

2

會發生什麼情況是這樣的

  • 你定義一個Foo ::叫
  • 您修改後與
  • 你定義一個酒吧::調用不調用foo ::呼叫

修飾符不是神奇的運行時間事物,而是類定義時間事物。要做你在這裏做的事情,你必須以不同的方式構建代碼

+0

謝謝,萊昂!你有一個想法如何完成我想在這裏做的事情? – memowe

0

@RobEarl發佈了一個鏈接到very similar question。該解決方案張貼在那邊是使用augment,雖然它看起來有點陌生和它的使用是有爭議的,它可以解決我的問題:

package Foo; 
use Moose; 

has called => (is => 'rw', isa => 'Bool', default => 0); 
sub call { inner(); shift->called(1); 'Foo called' } 

package Bar; 
use Moose; 
extends 'Foo'; 

augment call => sub { 'Bar called' }; 

my $bar = Bar->new(); 
say $bar->called; # 0 
say $bar->call;  # Bar called 
say $bar->called; # 1