Catalyst中DBIx :: Class :: Schema模型上的Moose方法修饰符

时间:2010-12-07 14:28:26

标签: perl moose catalyst dbix-class

对于任何给定的结果类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教条表示永远不会搞砸新的。

任何人都愿意帮助我理解为什么会这样,或者是否有更好的方法?

1 个答案:

答案 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

我真的希望这适合你!