2010-12-07 11 views
9

yılında Şema modelleri (varsayılan şema yükleyici inşa Moose/MooseX :: nonmoose kullanan sözdizimi oluşturulur)Moose yöntemi düzenleyiciler :: herhangi bir sonuç sınıfı myschema :: Sonucu :: Foo için Catalyst

Ben şöyle bir satır için yapıcı verilerini sterilize bir BUILDARGS yöntemi sarmalayıcı eklerseniz:

doğrudan şemayı kullanan zaman çalışır
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(@_); 
}; 

. - Katalizör :: Modeli ile aynı şema kullanıldığında> yeni Ancak

use MySchema; 
my $s = MySchema->connect('dbi:blahblahblah'); 
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win 

olarak adlandırılan yeni bir satır nesne real_column => 'değeri' ile oluşturulan ve not_a_real_column önce çıkarılır: beklendiği gibi, aşağıdaki işleri Örneğin :: DBIC :: Schema siparişi farklıdır. Aşağıdakiler, not_a_real_column geçersiz olduğundan yeni bir Foo satır nesnesi oluşturmaya çalışırken başarısız olur. Başka bir deyişle, yeni argümanlar önce BUILDARGS üzerinden geçmez -> yeni denir.

$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails 

İlginçtir ki, etrafta 'yeni' => sub {} yerine etrafına sarın eğer 'BUILDARGS' => alt {} davranışı her iki durumda da aynıdır ve gayet iyi çalışıyor, ama benim anlayış Moose dogma, asla yeni bir şeyle dalga geçmez.

Bu durumun neden böyle olduğunu anlamama yardımcı olmak veya daha iyi bir yolu var mı?

cevap

1

Görüyorum, MooseX :: NonMoose kullanıyorsunuz.

, sana FOREIGNBUILDARGS

around 'FOREGINBUILDARGS' => sub { 
    my $orig = shift; 
    my $class = shift; 
    delete $_[0]->{not_a_real_column}; 
    return $class->$orig(@_); 
}; 

kullanmanız gerektiğini bir tahminim var olduğu göz önüne alındığında "MooseX :: NonMoose bir FOREIGNBUILDARGS yöntemi tanımlayarak üst sınıf yapıcısına geçirilen argümanı listesini yönetmenize olanak sağlar."
http://metacpan.org/pod/MooseX::NonMoose

Umarım bu sizin için çalışır!

İlgili konular