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