对于任何给定的结果类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教条表示永远不会搞砸新的。
任何人都愿意帮助我理解为什么会这样,或者是否有更好的方法?
答案 0 :(得分: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
我真的希望这适合你!