Let*_*_Be 4 perl constructor 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 => '' );
Run Code Online (Sandbox Code Playgroud)
问题是BUILD似乎在验证发生后运行.BUILDARGS似乎处理构造对象的不同方式的所有示例.
那么我应该在哪里阅读配置并设置属性?
Give teachers_file和students_file builder方法(或内联子default)从配置文件中设置它们.只有在未将这些属性作为构造函数的键提供时,构建器才会运行(除非您使用init_arg => undef它们来阻止它们在构造函数中设置).
如果您的配置是它自己的属性,并且使用构建器读取配置文件,那么您config和teachers_fileand 之间存在排序问题students_file.您可以通过make teachers_file和students_filelazy属性来解决这个问题,这可以确保在config属性之前不会尝试构造它们.但是,您可能希望确保在构造期间尽早抛出"foo不是可读文件"错误,而不是第一次使用该属性.您可以通过添加来解决这个问题
sub BUILD {
my $self = shift;
$self->teachers_file;
$self->students_file;
}
Run Code Online (Sandbox Code Playgroud)
这确保在构造函数返回之前读取(并构造)这些属性.