Как в Moose объявить предикатные и более четкие методы при определении нескольких атрибутов?

В Moose вы можете сразу объявить группу атрибутов, предполагая, что параметры инициализации одинаковы:

has [qw( foo bar baz )] => (
    is => 'ro',
    isa => 'Str',
    required => 1,
);

Это прекрасная функция, которая экономит массу времени при наборе текста. Однако я озадачен тем, как определить предикат, очиститель или даже метод построителя, используя этот синтаксис.

has 'foo' => (
    is        => 'ro',
    isa       => 'Str',
    required  => 1,
    clearer   => 'clear_foo',
    predicate => 'has_foo',
);

Есть ли параметр, который я могу использовать для создания стандартных методов has_X, 'clear_X и _build_X для всех атрибутов в моем списке?


person daotoad    schedule 12.10.2010    source источник


Ответы (2)


has $_ => (
    is => 'ro',
    isa => 'Str',
    required => 1,
    clearer => '_clear_' . $_,
    # etc...
) for (qw(foo bar baz);

Обратите внимание, что lazy_build => 1 будет автоматически генерировать очистители и предикаты, но они всегда будут общедоступными, что начинает осуждаться в сообществе Moose. (Я не думаю, что кто-то написал об этом в блоге, но в последнее время это было темой для разговоров на IRC #moose.)

person Ether    schedule 12.10.2010
comment
Я должен был подумать об этом. То, что has выглядит как объявление, не означает, что это не исполняемый код. - person daotoad; 12.10.2010
comment
Мелкая проблема со стилем, но я бы сделал это foreach (qw(foo bar baz)) {...}. Имена атрибутов появляются немного позже во фрагменте кода ответа. - person Piers Cawley; 07.08.2012

lazy_build => 1,

Это также помечает их как ленивых, но рекомендуется для атрибутов со строителем.

person cjm    schedule 12.10.2010
comment
Вы можете указать ленивую сборку, используя lazy => 1. Затем вы можете специально объявить, хотите ли вы предикат и/или яснее. - person NickJHoran; 13.11.2014