2010-03-05 7 views
6

Soy nuevo en Moose y estoy tratando de usarlo con DBIx :: Class. Consulta básica de DBIC y actualización del trabajo encontrado, pero cualquier desencadenante que intente escribir no se ejecuta cuando modifico un atributo.Disparadores de alces que no se activan cuando se usa DBIX :: Clase

use Modern::Perl; 
use Data::Dumper; 

my $schema = My::Schema->connect(<connect str>, <usr>, <psw>) or die $!; 
my $rs = $schema->resultset('Isin')->search(sid => 3929); 
my $security_obj = $rs->first; 
print $security_obj->isin, "\n"; 
$security_obj->isin('Test1Foo'); # <- expect to see FOO printed by trigger 
print $security_obj->isin, "\n"; 

Espero ver el disparador para 'isin' imprimir 'FOO', pero no pasa nada. Si elimino DBIx :: Class del paquete, el desencadenador se ejecutará como se espera.

Sospecho que DBIx :: Class está estableciendo el valor de una manera que evita que el disparador se dispare.

Desafortunadamente, no he tenido mucha suerte para encontrar recursos sobre el uso de DBIx :: Class con Moose. Lo que he escrito se basa principalmente en lo que encontré en DBIx::Class and Moose.

¿Estoy usando DBIx :: Class y/o Moose mal? ¿Hay algún ORM diferente que debería usar con Moose?

El paquete con el gatillo que el fuego no será:

package My::Schema::Result::Isin; 

use DBIx::Class; 
use Moose; 
use Carp; 
extends 'DBIx::Class'; 

has 'isin' => (is => "rw", isa => "Str", trigger => \&_mod_isin); 
has 'sid' => (is => "ro", isa => "Int"); 

sub _mod_isin { 
    print "FOO\n"; 
    return; 
}; 

no Moose; 

__PACKAGE__->load_components('Core'); 

__PACKAGE__->table('isin'); 

__PACKAGE__->add_columns(
    isin => { data_type => 'varchar2', size => 12 }, 
    sid => { data_type => 'integer', size => 6 }, 
); 

__PACKAGE__->set_primary_key('isin'); 
+1

Parece que los métodos autogenerados de DBIC están sobreescribiendo los métodos autogenerados de Moose. El objetivo de Moose es evitar esto, pero no puede hacer eso cuando algo no usa Moose. Tal vez solo quieres un modificador "alrededor". – jrockway

Respuesta

-3

¿Ha intentado utilizar writer => \&_mod_isin en su lugar?

+0

Esperemos que no, porque entonces el programa moriría en tiempo de compilación. – jrockway

2

Primero, tiene el problema de extender una clase que no sea Moose desde dentro de Moose. Esto es un problema porque DBIx :: Class no hereda de Moose :: Object, por lo que no obtendrá los métodos estándar de Moose como does. Consulte Moose::Cookbook::Basics::Recipe11 para resolver este problema.

En segundo lugar, tiene el problema más grande que tiene dos conjuntos diferentes de magia que están tratando de crear subrutinas para usted. Tienes a Moose, cuya magia crea las subrutinas isin y sid, y tienes DBIx :: Class, cuya magia también crea las subrutinas isin y sid que reemplazan las que creó Moose.

Es posible que desee redactar en una función de Moose con un modificador around, como se sugirió en jrockway.

Cuestiones relacionadas