Как я могу создать объект лося из хеша, сгенерированного из одного из атрибутов? - PullRequest
0 голосов
/ 29 января 2012

У меня есть пара пакетов:

package FOO;
use Moose;
has 'obj' => (is=>'ro');
sub hash { 
    my $self = shift;
    return $self->make_hash($self->obj}; 
}

и еще один пакет, расширяющий FOO:

package FOOBAR;
use Moose;
extends 'FOO';
has [qw/val1 val2/] => (is => 'rw');
sub BUILD {
    my ($self) = @_;
    $self->val1($self->hash->{val1});
    $self->val2($self->hash->{val2});
}

В основном я хочу сделать FOOBAR->new(obj=>$obj); и использовать хэш, сгенерированный из $obj, для заполнения атрибутов, указанных в FOOBAR (~ 20 или около того атрибутов)

Является ли использование 'BUILD' хорошим способом решения этой проблемы?

1 Ответ

1 голос
/ 29 января 2012

Почему?Затем вы получите две копии данных.Вместо этого делегируйте.

has obj => (
   is      => 'ro',
   handles => {
      val1 => sub { my $self = shift; my $obj = $self->obj; ... },
      val2 => sub { my $self = shift; my $obj = $self->obj; ... },
   },
);

Если методы доступа практически идентичны, вы можете сделать что-то вроде

sub make_obj_accessor {
   my ($name) = @_;
   return sub {
      my $self = shift;
      my $obj = $self->obj;
      ... $name ...
   };
}

has obj => (
   is      => 'ro',
   handles => {
      (map make_obj_accessor($_), qw(
         val1
         val2
      ))
   },
);

Конечно, если у вас действительно есть только хеш, все что вам нужно -

FOOBAR->new( %hash )
...