Как вы создаете обработчики атрибутов для методов объекта в Perl / Moose - PullRequest
2 голосов
/ 26 сентября 2011

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

package tree;
      has '_branches' => (
               traits    =>  ['Hash'], 
               is        => 'rw', 
               isa       => 'HashRef[Any]', 
               handles   => {
                  _set_branch  => 'set',
                  _is_branch   => 'defined',
                  _list_branches => 'keys',
                  _branch => 'get'
               },
               trigger   => sub {
                  my($self,$hash) = @_;
                  $self->_build_branch($hash);
               }

      );


sub _build_branch{
  my($self,$hash);
  # do stuff!
  #return altered or coerced hash
  return $hash;
}

Как вы думаете?

Но скажем, например, у меня естьОбъект LinkedList со следующими методами

LinkedList{}
LinkedList.append()
LinkedList.insert()
LinkedList.size()
LinkedList.has_children()
LinkedList.remove()
LinkedList.split()

Есть ли способ обработки методов объекта через атрибуты Moose (без использования MooseX) - аналогично этому?

package Bucket;
      has '_linkedlist' => (
               traits    =>  ['LinkedList'], 
               is        => 'rw', 
               isa       => 'LinkedListRef[Any]', 
               handles   => {
                  _add_link  => 'append',
                  _insert_link   => 'insert',
                  _count_links => 'size',
                  _del_link => 'remove',
                  _split_at_link => 'split',
                  _has_sublinks => 'has_children', 
               },

Было бы замечательно, если быбыл способ сделать это, но я обеспокоен, может быть, я где-то неправильно понял, как или зачем создавать обработчики для неродных атрибутов.

Мысли?

1 Ответ

4 голосов
/ 26 сентября 2011

Вы просто слишком усложняете вещи, или я что-то упускаю?

package Bucket;
has '_linkedlist' => (
   is        => 'rw', 
   isa       => 'LinkedList', 
   handles   => {
      _add_link      => 'append',
      _insert_link   => 'insert',
      _count_links   => 'size',
      _del_link      => 'remove',
      _split_at_link => 'split',
      _has_sublinks  => 'has_children', 
   },
);

Хэши не имеют методов, поэтому в нем есть черта.Черта добавляет методы.Ваш класс LinkedList имеет методы, поэтому не нужно писать черту для предоставления методов.

...