2010-12-07 8 views
9

Für jede gegebene Ergebnisklasse MYSCHEMA :: Ergebnis :: Foo (aus Standardschema Loader gebaut erzeugt Syntax, die Moose/MooseX verwendet :: nonmoose)Moose Methode Modifikatoren auf DBIx :: Class :: Schema Modelle in Katalysator

Wenn ich eine BUILDARGS Methode Wrapper hinzufügen, wie so die Konstruktor Daten für eine Zeile zu sanieren:

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(@_); 
}; 

Es funktioniert, wenn das Schema direkt verwenden. Zum Beispiel können die folgenden Arbeiten wie erwartet: Eine neue Zeile Objekt mit real_column => ‚Wert‘ erstellt und not_a_real_column, bevor sie entfernt -> neue

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

jedoch aufgerufen wird, wenn das gleiche Schema über Katalysator :: Modell mit :: DBIC :: Schema ist die Reihenfolge unterschiedlich. Beim Versuch, ein neues Foo-Zeilenobjekt zu erstellen, schlägt Folgendes fehl, da not_a_real_column ungültig ist. Mit anderen Worten, die Argumente zu new werden nicht erst durch BUILDARGS durchlaufen -> new wird aufgerufen.

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

Interessanterweise, wenn ich wrap around 'new' => sub {} statt um 'BUILDARGS' => sub {} ist das Verhalten in beiden Fällen gleich, und funktioniert gut, aber nach meinem Verständnis Elch-Dogma besagt, dass man sich niemals mit neuen Dingen anlegen soll.

Wer kümmert sich darum, mir zu erklären, warum das der Fall ist oder ob es einen besseren Weg gibt?

Antwort

1

Ich sehe, Sie verwenden MooseX :: NonMoose.

Da ich eine Vermutung haben, dass Sie FOREIGNBUILDARGS

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

„MooseX :: NonMoose können Sie die Argument-Liste bearbeiten, die durch die Definition eines FOREIGNBUILDARGS Methode zum Oberklassenkonstruktors übergeben wird.“ Verwenden müssen
http://metacpan.org/pod/MooseX::NonMoose

Ich hoffe wirklich, das funktioniert für Sie!

Verwandte Themen