Модификаторы метода Moose в DBIx :: Class :: Schema модели в Catalyst - PullRequest
9 голосов
/ 07 декабря 2010

Для любого заданного класса результатов 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 {}, то поведение в обоих случаях одинаковое и работает нормально, но, насколько я понимаю, догма лося утверждает: никогда не связывайтесь с новым.

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

1 Ответ

1 голос
/ 09 декабря 2011

Понятно, что вы используете 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

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

...