Как я могу изменить дескриптор атрибута Moose? - PullRequest
1 голос
/ 23 октября 2010

После ответа phaylon на «Как гибко добавлять данные в объекты Moose?» , предположим, у меня есть следующий атрибут Moose:

has custom_fields => (
    traits     => [qw( Hash )],
    isa        => 'HashRef',
    builder    => '_build_custom_fields',
    handles    => {
        custom_field         => 'accessor',
        has_custom_field     => 'exists',
        custom_fields        => 'keys',
        has_custom_fields    => 'count',
        delete_custom_field  => 'delete',
    },
);

sub _build_custom_fields { {} }

Теперь предположим, что я бы хотел каркнуть, если попытался прочитать (но не записать) несуществующее настраиваемое поле. phaylon предложил мне обернуть custom_field модификатором вокруг. Я экспериментировал с модификаторами around, следуя различным примерам в документации Moose, но не мог понять, как изменить дескриптор (а не просто метод объекта).

В качестве альтернативы, есть ли другой способ реализовать этот ключ, который можно выдумать?

1 Ответ

6 голосов
/ 24 октября 2010

Они все еще просто методы, сгенерированные Moose. Вы можете просто сделать:

around 'custom_field' => sub {
    my $orig  = shift;
    my $self  = shift;
    my $field = shift;

    confess "No $field" unless @_ or $self->has_custom_field($field);

    $self->$orig($field, @_);
};

(croak на данный момент не очень полезен в модификаторах методов. Он просто укажет на внутренний код Moose.)

На самом деле вам не нужно использовать around для этого. Использовать before проще:

before 'custom_field' => sub {
    my $self  = shift;
    my $field = shift;

    confess "No $field" unless @_ or $self->has_custom_field($field);
};
...