2011-08-14 41 views
4

我有一個附加驗證的文件名屬性。現在當在構造過程中未指定文件名時,我想從配置文件中讀取它。Moose:將參數注入到構造中

subtype 'filename' 
     => as 'Str' 
     => where { -r $_ } 
     => message { "$_ is not a readable file" }; 

has 'students_file' => (is => 'rw', isa => 'filename', default => ''); 
has 'teachers_file' => (is => 'rw', isa => 'filename', default => ''); 

問題是BUILD似乎在驗證發生後運行。 BUILDARGS的所有示例似乎都處理構建對象的不同方式。

那麼我應該在哪裏閱讀配置並設置屬性?

回答

7

給出teachers_filestudents_filebuilder方法(或內嵌default潛艇),它們從配置文件中設置它們。只有在作爲構造函數的鍵提供的屬性不是時,構建器纔會運行(除非使用init_arg => undef阻止它們在構造函數中設置)。

如果您的配置是其自己的屬性,並帶有一個讀取配置文件的構建器,那麼您在configteachers_filestudents_file之間的訂購問題。您可以通過製作teachers_filestudents_file lazy屬性來解決此問題,這可確保它們不會嘗試在config屬性之前構建。但是,您可能需要確保在構建期間儘可能早地拋出「foo不是可讀文件」錯誤,而不是第一次使用該屬性。您可以通過添加

sub BUILD { 
    my $self = shift; 
    $self->teachers_file; 
    $self->students_file; 
} 

從而確保這些屬性在構造函數返回之前讀取一次(和構造)解決這一點。

相關問題