でのスキーマモデル(デフォルトのスキーマローダーから構築はムース/ 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」=>サブ{}行動はどちらの場合も同じであり、正常に動作しますが、私の理解しますムースドグマは、決して新しいものを混乱させないと言います。
これがなぜこのようになるのか、もっと良い方法があるのか理解してもらえますか?