对于任何给定的结果类 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' 创建新行对象,并在调用 ->new 之前删除 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::Schema 使用相同的模式时,顺序是不同的。尝试创建新的 Foo 行对象时以下失败,因为 not_a_real_column 无效。换句话说, new 的参数在调用 ->new 之前不会通过 BUILDARGS 运行。
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails
有趣的是,如果我环绕 'new' => sub{} 而不是 'BUILDARGS' => sub{} 两种情况下的行为是相同的,并且工作正常,但据我了解 Moose 教条状态永远不会混淆新的。
任何人都愿意帮助我理解为什么会这样,或者是否有更好的方法?