2010-12-07 3 views
9

Для любого заданного результата класса MySchema :: Result :: Foo (построено из схемы по умолчанию загрузчика генерируется синтаксиса, который использует Moose/MooseX :: nonmoose)метод Moose модификаторы на DBIx :: Class :: модель схемы в Catalyst

Если добавить метод BUILDARGS обертки для санитарной обработки данных конструктора для строки, как так:

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

Он работает при использовании схемы непосредственно. Например следующие работы, как и ожидалось: Новый объект строка создается с real_column => «значение» и not_a_real_column удалены прежде -> новый называется

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

Однако, при использовании той же схемы с помощью Catalyst :: Model :: DBIC :: Схема заказа разных. При попытке создать новый объект строки Foo выполняется следующее: not_a_real_column недействителен. Другими словами, аргументы new не запускаются через BUILDARGS до того, как вызывается -> new.

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

Интересно, что если я обернуть вокруг «новый» => суб {} вместо вокруг «BUILDARGS» => югу {} поведение является одинаковым в обоих случаях, и работает хорошо, но, к моему пониманию Муз-догма заявляет, что никогда не возится с новым.

Кто-нибудь хочет помочь мне понять, почему это так, или если есть лучший способ?

ответ

1

Я вижу, вы используете MooseX :: NonMoose.

Учитывая, что у меня есть предположение, что вам нужно использовать FOREIGNBUILDARGS

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

«MooseX :: NonMoose позволяет управлять списком аргументов, которая будет послана конструктора суперкласса, определив метод FOREIGNBUILDARGS.»
http://metacpan.org/pod/MooseX::NonMoose

Я действительно надеюсь, что это сработает для вас!