穆斯:将参数注入施工中

时间:2011-08-14 19:42:35

标签: 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 => '' );

问题是BUILD似乎在验证发生后运行。 BUILDARGS的所有示例似乎都处理了构造对象的不同方式。

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

1 个答案:

答案 0 :(得分:7)

提供从配置文件设置它们的teachers_filestudents_file builder个方法(或内联default个子)。仅当那些属性不是作为构造函数的键提供时,构建器才会运行(除非您使用init_arg => undef来阻止它们在构造函数中设置)。

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

来解决这个问题
sub BUILD {
  my $self = shift;
  $self->teachers_file;
  $self->students_file;
}

确保在构造函数返回之前读取(并构造)这些属性。