2011-10-18 71 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(); 

使用perl 5.8.8和駝鹿2.0205爲什麼Moose make_immutable殺死這個腳本?

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

回答

3

您已經定義了_sql_lib屬性兩次,一次說isa Str,一旦說它處理方法(其中Str並非如此),但是這不是你正在談論的問題。

主要問題是您沒有用lazy => 1定義_sql_lib。其構建器(或default)依賴於對象的其他屬性的任何屬性必須爲lazy,這是因爲Moose不保證在對象構建過程中賦予屬性值的順序。

# 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', 
    }, 
); 

make_immutable帶出了錯誤的原因是調用它生成的類,它發生在不同的順序初始化屬性的不同構造。

+0

oops其他'_sql_lib'是一個調試錯誤。你的懶惰=> 1修復技巧。謝謝! –