2012-09-11 8 views
5

He encontrado que si una subclase agrega un activador, entonces los modificadores de método de la clase base no se ejecutan. Esto parece un error de Moose, o al menos no intuitivo. Aquí está mi ejemplo:activadores de perl alce en subclases modificadores de método de interrupción

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

Si ejecuta este ejemplo, sólo el "esto se my_trigger", advierten carreras, mientras que el "antes" se ignora modificador. Estoy usando Perl 5.14.2 con Moose 2.0402.

¿Este comportamiento es correcto? No parece correcto, especialmente porque el disparador disparará después del anterior cuando el disparador se define directamente en la clase base.

Respuesta

4

Sobre el principio de que no se debe poder distinguir entre el código heredado y el código de la clase, lo llamaría un error.

Parece ser un problema general cuando la adición a un atributo elimina los modificadores del método. Este código demuestra su error sin involucrar desencadenadores.

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, agregué un informe de error aquí: https://rt.cpan.org/Public/Bug/Display.html?id=79572. Mientras tanto, puedo evitarlo repitiendo el modificador de método en la subclase, supongo. – rrm1

Cuestiones relacionadas