В Moose, как вы объявляете предикаты и более ясные методы при определении нескольких атрибутов? - PullRequest
2 голосов
/ 12 октября 2010

В 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 для всех атрибутов в моем списке?

Ответы [ 2 ]

9 голосов
/ 12 октября 2010
has $_ => (
    is => 'ro',
    isa => 'Str',
    required => 1,
    clearer => '_clear_' . $_,
    # etc...
) for (qw(foo bar baz);

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

1 голос
/ 12 октября 2010
lazy_build => 1,

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

...