Как я могу реализовать новую ручку для черты типа Moose? - PullRequest
4 голосов
/ 05 октября 2011

Допустим, я хотел добавить say функциональность к String (примечание: это более простой пример, чем реальность) . Так что я мог бы иметь

has foo => (
   isa => 'Str',
   traits => [ 'String' ],
   handles => {
     say_foo => 'say',
   }
);

, который я тогда, конечно, смог бы использовать.

$self->foo( 'bar' );

$self->say_foo;

который печатал бы буквально

'bar\n'

Я полагаю, что подпрограмма будет выглядеть примерно так

sub _say_attr {
   my ( $self, $attr ) = @_;
   say $attr;
}

Может ли кто-нибудь помочь мне заполнить пробелы в том, как я мог бы на самом деле реализовать это? Я не особо вижу документацию о том, как написать свой собственный handles.

Мне не нужно знать, как изменить черты String. Как бы я не хотел иметь общий обработчик, в котором мне не нужно знать имя текущего атрибута, чтобы он работал.

has foo => (
    isa => 'Str',
    traits => [ 'PrintString' ],
     handles => {
         say_foo => 'say',
     }
);
has bar => (
    isa => 'Str',
    traits => [ 'PrintString' ],
     handles => {
         say_bar => 'say',
     }
);

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

1 Ответ

2 голосов
/ 05 октября 2011

Вы действительно хотите добавить say к String, или вы будете довольны добавлением say_foo к foo?

Последнее легко:

has foo => (
   isa => 'Str',
   traits => [ 'String' ],
   handles => {
     say_foo => sub { say $_[0]->foo; },
   }
);

Если вы хотите более общее решение, вы должны взглянуть на Moose :: Meta :: Attribute :: Native :: Trait :: String и скопировать / wrap / подкласс, а не пытаться изменить.

...