Модификаторы метода Moose в моделях DBIx :: Class :: Schema в Catalyst

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

Если я добавлю оболочку метода 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 => 'value' и not_a_real_column до -> вызывается new

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 :: Schema порядок отличается. Следующая ошибка при попытке создать новый объект строки 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

Достаточно интересно, что если я оберну вокруг 'new' => sub {} вместо 'BUILDARGS' => sub {}, поведение будет одинаковым в обоих случаях и работает нормально, но, насколько я понимаю, догма Moose утверждает, что никогда не связывайтесь с новым.

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

9
задан Ether 7 December 2010 в 18:59
поделиться