Как я могу настроить группу создателей атрибутов в объекте Moose? - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть следующие пять атрибутов Moose:

has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
    is       => 'rw',
    isa      => 'Str',
    required => 0,
    lazy     => 1,
    default  => sub { confess "Attribute not set"; },
    );

Я бы хотел:

  1. Заставьте каждого из них использовать свой собственный конструктор (например, установите 'summary_file' используйте _build_summary_file и т. Д.)
  2. Сделать вложенное состояние по умолчанию confess, которое (неинициализированный) атрибут был вызван (например, "Attribute 'summary_file' not set").

Я могу выполнить вышесказанное, написав пять отдельных has, но, возможно, есть более компактный способ?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

Вы можете сделать что-то подобное (новый рабочий пример после вашего комментария «не работает» ниже):

package My::Class;
use Moose;
use namespace::autoclean;

for my $attr (qw(x y)) {
    has $attr => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
        lazy     => 1,
        builder  => "_build_$attr",
    );
}

sub _build_x { rand }
sub _build_y { rand }

__PACKAGE__->meta->make_immutable;

package main;

use strict; use warnings;

my $o = My::Class->new;

print $o->$_, "\n" for qw(x y);

Обратите внимание, что вы не можете указать и default, и builder.

@ Оесор указывает в комментарии то, что я забыл:

has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
    is         => 'rw',
    isa        => 'Str',
    required   => 0,
    lazy_build => 1,
);
0 голосов
/ 05 октября 2011

Если вы ищете атрибут для выдачи исключения при доступе, когда для него не установлено значение, посмотрите на MooseX :: LazyRequire .

Если вы ищете сборщика для выдачи предупреждения, если оно вызывается, включите этот оператор в метод построителя ... ИЛИ оберните метод accessor / reader для этого. (например, "before 'attribute_name' => sub { ...complain... };")

Если вы ищете способ указать методы построителя для атрибута, используя то же соглашение о присвоении имен, что и в lazy_build, см. MooseX :: AttributeShortcuts (поддержка 'builder => 1' как 'builder => "_build_${attribute_name}"' ).

...