2011-08-14 2 views
4

私は、検証を添付したファイル名属性を持っています。今、ファイル名が構築中に指定されていないとき、私はそれを構成ファイルから読みたいと思います。ムース:建設にパラメータを入力する

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

configファイルから設定する方法(またはインラインdefault subs)をteachers_filestudents_filebuilderと指定します。ビルダーは、の属性がinit_arg => undefを使用してコンストラクターに設定されないようにする場合を除き、がコンストラクターのキーとして提供されていない場合にのみ実行されます。

configが独自の属性であり、configファイルを読み込むビルダーを使用している場合、configteachers_filestudents_fileの間に問題があります。これを解決するには、teachers_filestudents_fileの遅延属性を設定します。これにより、config属性の前に構築しようとしないことが保証されます。ただし、最初に属性を使用するのではなく、「fooは可読ファイルではありません」というエラーが、構築中にできるだけ早くスローされるようにすることをお勧めします。あなたはこれらの属性は、コンストラクタが戻る前に一度読んで(と構築)されることが保証されます

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

を追加することで回避することができます。

関連する問題