2010-10-23 2 views
1

После phaylon's answer to "How can I flexibly add data to Moose objects?", предположим, что у меня есть следующий Муз атрибут:Как изменить атрибут атрибута 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, но не мог понять, как изменить дескриптор (а не только метод объекта).

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

ответ

6

Они все еще просто методы, созданные 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 не очень полезно в методе модификаторов на данный момент он просто укажет вам на внутреннем Мус коде)

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

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

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

@David B, 'handles' создает стандартные методы объекта. Объект не может иметь два метода с тем же именем. Как он узнает, с кем вы звонили? (Perl 5 не имеет многоточия.) – cjm

+0

+1 Спасибо, cjm. Я пытался изменить свой комментарий, на который вы ответили, но случайно удалил его. Только для записи я спрашивал что-то вроде «что происходит, если два атрибута имеют дескриптор с тем же именем». По-видимому, это невозможно. Еще раз спасибо! –

+2

@ David только для пояснения, опция 'handles' предназначена для чтения как глагол 'handles', а не существительные 'handles'. Как и в «этом атрибуте * обрабатывает * эти методы», а не «этот атрибут имеет эти ручки». Это инструмент для делегаций. – hobbs

Смежные вопросы