2010-12-07 40 views
9

Pour toute classe résultat donné MySchema :: Résultat :: Foo (construit à partir de chargeur de schéma par défaut généré syntaxe qui utilise Moose/MooseX :: nonmoose)modificateurs de méthode Moose sur DBIx :: Class :: modèles de schéma dans les Catalyst

Si j'ajoute une enveloppe de méthode BUILDARGS pour aseptiser les données du constructeur pour une ligne comme ceci:

package MySchema::Result::Foo; 
use Moose; 
use MooseX::NonMoose; 
[etc ..] 

around 'BUILDARGS' => sub { 
    my $orig = shift; 
    my $class = shift; 
    delete $_[0]->{not_a_real_column}; 
    return $class->$orig(@_); 
}; 

Il fonctionne en utilisant le schéma directement. Par exemple, les travaux suivants comme prévu: Un nouvel objet de ligne est créé avec real_column => « valeur » et not_a_real_column enlevée avant -> nouvelle est appelée

use MySchema; 
my $s = MySchema->connect('dbi:blahblahblah'); 
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win 

Cependant, lorsque vous utilisez le même schéma via Catalyst :: Modèle :: DBIC :: Schema la commande est différente. La procédure suivante échoue lors de la tentative de création d'un nouvel objet ligne Foo car not_a_real_column n'est pas valide. En d'autres termes, les arguments de new ne sont pas exécutés dans BUILDARGS avant -> new est appelé.

$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails 

Chose intéressante, si j'enrouler autour de « nouveau » => sub {} au lieu d'environ « BUILDARGS » => sub {} le comportement est le même dans les deux cas, et fonctionne très bien, mais à ma compréhension Les dogmes de l'orignal ne doivent jamais jouer avec le nouveau.

Quelqu'un veut-il m'aider à comprendre pourquoi c'est le cas, ou s'il y a un meilleur moyen?

Répondre

1

Je vois, vous utilisez MooseX :: NonMoose.

Étant donné que, j'ai une supposition que vous devez utiliser FOREIGNBUILDARGS

around 'FOREGINBUILDARGS' => sub { 
    my $orig = shift; 
    my $class = shift; 
    delete $_[0]->{not_a_real_column}; 
    return $class->$orig(@_); 
}; 

« MooseX :: NonMoose vous permet de manipuler la liste des arguments qui est transmis au constructeur superclasse en définissant une méthode FOREIGNBUILDARGS. »
http://metacpan.org/pod/MooseX::NonMoose

J'espère vraiment que cela fonctionne pour vous!