2011-10-18 7 views
1
package testDB; 
use Moose; 
use Carp; 
use SQL::Library; 

has 'lib' => (#FOLDBEG 
    is => 'rw', 
    isa => 'Str', 
    default => 'default', 
    trigger => \&_sql_lib_builder, 
);#FOLDEND 

has 'lib_dir' => (#FOLDBEG 
    is => 'ro', 
    isa => 'Str', 
    default => '/SQL', 
);#FOLDEND 

has '_sql_lib' => (#FOLDBEG                                
    builder => '_sql_lib_builder', 
    is => 'rw', 
    isa => 'Str', 
); 

has '_sql_lib' => (#FOLDBEG                                
    builder => '_sql_lib_builder', 
    is => 'rw', 
      handles => { 
     get_sql => 'retr', 
     get_elements => 'elements', 
    }, 
); 

sub _sql_lib_builder { 
    my ($self, $lib) = shift(); 
    $self->lib() or die("I am unable to get a lib."); 
    $lib = $self->lib unless $lib; 


    my $lib_dir = $self->lib_dir; 
    print $lib_dir."\n"; 

    my $lib_file = $lib_dir . '/' . $lib . '.sql'; 

    unless (-e $lib_file) { 
     confess "SQL library $lib does not exist"; 
    } 

    my $library = new SQL::Library { lib => $lib_file }; 

    $self->_sql_lib($library); 

}#FOLDEND 

__PACKAGE__->meta->make_immutable; 

my $tdb=testDB->new(); 

と2.0205Moose make_immutableがこのスクリプトを強制終了するのはなぜですか? perlの5.8.8を使用して

$ perl testDB.pl 
I am unable to get a lib. at testDB.pl line 35. 

答えて

3

をムースあなたは一度isa Strを言って、一度それが(Strにはない)方法を扱うと言って、二回_sql_lib属性を定義したが、それはありませんあなたが話している問題。

主な問題は、あなたがlazy => 1_sql_libを定義していないということです。ビルダー(またはdefault)がオブジェクトの他の属性に依存する属性は、オブジェクト構築中に属性に値が割り当てられる順序を保証しないため、lazyである必要があります。 make_immutableバグを引き出すこと

# REMOVE THIS: 
#has '_sql_lib' => (#FOLDBEG         
# builder => '_sql_lib_builder', 
# is => 'rw', 
# isa => 'Str', 
#); 

has '_sql_lib' => (#FOLDBEG         
    builder => '_sql_lib_builder', 
    is => 'rw', 
    lazy => 1,      # ADD THIS LINE 
    handles => { 
     get_sql => 'retr', 
     get_elements => 'elements', 
    }, 
); 

理由は、それを呼び出すと異なる順序で属性を初期化するために、たまたま自分のクラスの別のコンストラクタを生成していることです。

+0

他の '_sql_lib'はデバッグエラーでした。あなたの怠け者=> 1の修正がそのトリックを行います。ありがとう! –

関連する問題