2012-09-11 12 views
5

Ho scoperto che se una sottoclasse aggiunge un trigger, i modificatori di metodo dalla classe base non vengono eseguiti. Questo sembra un bug di Alce, o almeno non intuitivo. Ecco il mio esempio:trigger perl alci in sottoclassi disturbano i modificatori del metodo

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); 

Se si esegue questo esempio, solo il "This Is my_trigger" mettere in guardia corre, e il "prima" modificatore viene ignorato. Sto usando Perl 5.14.2 con Moose 2.0402.

È corretto questo comportamento? Non sembra giusto, specialmente dal momento che il trigger si attiva dopo il primo quando il trigger è definito direttamente nella classe base.

risposta

4

Secondo il principio che non dovresti essere in grado di distinguere tra codice ereditato e codice nella classe, direi che si tratta di un bug.

Sembra essere un problema generale in cui l'aggiunta a un attributo rimuove i modificatori di metodo. Questo codice dimostra il tuo bug senza coinvolgere i trigger.

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, ho aggiunto un bug report qui: https://rt.cpan.org/Public/Bug/Display.html?id=79572. Nel frattempo posso aggirarlo ripetendo il modificatore del metodo nella sottoclasse, suppongo. – rrm1

Problemi correlati