2010-12-07 2 views
9

でのスキーマモデル(デフォルトのスキーマローダーから構築はムース/ MooseX :: nonmooseを使用しています 構文を生成)ムースメソッド修飾子::任意の結果クラスはMySchema ::結果:: Fooのための触媒

私はそうのような行のコンストラクタデータをサニタイズする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の順番は です。 not_a_real_columnが無効なため、新しいFoo行オブジェクトを作成しようとすると、次のエラーが発生します。言い換えれば、newへの引数は、 - > newが呼び出される前にBUILDARGSで実行されません。

$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

私は本当にこれがあなたのために働くことを願っています!

関連する問題