Perl Moose:将参数注入到构造中

Perl Moose:将参数注入到构造中,perl,constructor,moose,Perl,Constructor,Moose,我有一个附加了验证的filename属性。现在,如果在构造过程中没有指定文件名,我想从配置文件中读取它 subtype 'filename' => as 'Str' => where { -r $_ } => message { "$_ is not a readable file" }; has 'students_file' => ( is => 'rw', isa => 'filename', defau

我有一个附加了验证的filename属性。现在,如果在构造过程中没有指定文件名,我想从配置文件中读取它

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
的所有示例似乎都以不同的方式构造对象


那么,我应该在哪里读取配置并设置属性呢?

给出从配置文件中设置它们的
teachers\u file
students\u file
builder
方法(或内联
default
subs)。只有当这些属性没有作为构造函数的键提供时,构建器才会运行(除非您使用
init_arg=>unde
来防止在构造函数中设置它们)

如果您的配置是其自身的属性,且生成器读取配置文件,则在
config
teachers\u文件
students\u文件
之间存在排序问题。您可以通过设置
teachers\u file
students\u file
惰性属性来解决这个问题,这可以确保它们不会在config属性之前构建。但是,您可能希望确保在构造期间尽早抛出“foo不是可读文件”错误,而不是第一次使用该属性。您可以通过添加

sub BUILD {
  my $self = shift;
  $self->teachers_file;
  $self->students_file;
}
这样可以确保在构造函数返回之前读取(并构造)这些属性一次