2010-12-07 72 views
9

架構模型對於任何給定的結果類MYSCHEMA ::結果::美孚(從默認模式裝載機內置生成 語法它使用駝鹿/ 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 =>「值」創建和前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 

然而, :: 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 

有趣的是,如果我環繞「新」 =>子{},而不是圍繞「BUILDARGS」 =>子{}行爲是在兩種情況下是相同的,並且工作正常,但我的理解穆斯的教條規定永遠不要混淆新的。

有人幫我理解爲什麼會出現這種情況,或者有更好的方法嗎?

回答

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

我真的希望這對你有用!