如何从其中一个属性生成的哈希中构造moose对象



我有几个包:

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"是解决问题的好方法吗?

为什么?然后你会得到两份数据副本。改为委派。

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 )

最新更新