Лось: ввод параметров в конструкцию - PullRequest
4 голосов
/ 14 августа 2011

У меня есть атрибут имени файла с прикрепленной проверкой.Теперь, когда имя файла не указано во время построения, я хочу прочитать его из файла конфигурации.

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 Ответ

7 голосов
/ 15 августа 2011

Дайте teachers_file и students_file builder методы (или встроенные подпрограммы default), которые устанавливают их из файла конфигурации.Конструктор будет запускаться только в том случае, если эти атрибуты не предоставлены в качестве ключей для конструктора (если только вы не используете init_arg => undef для предотвращения их установки в конструкторе).

Если ваша конфигурацияэто собственный атрибут со сборщиком, который читает файл конфигурации, тогда у вас возникла проблема с порядком следования между config и teachers_file и students_file.Вы можете решить эту проблему, сделав атрибуты teachers_file и students_file lazy, что гарантирует, что они не будут пытаться создаваться до атрибута config.Однако вы можете убедиться, что ошибка «foo is not readable file» выдается как можно раньше во время построения, а не при первом использовании атрибута.Вы можете обойти это, добавив

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

, который гарантирует, что эти атрибуты будут прочитаны один раз (и созданы), прежде чем конструктор вернется.

...