2012-01-29 54 views
0

我有几个包:如何从一个属性中生成的哈希构造一个驼鹿对象?

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

为什么?然后你最终得到两份数据。代替。

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) 
+0

谢谢,但我正在使用哈希($ self->哈希,这对construnt a有一些魔法,从$ self-> obj),并且我不能委托给哈希中的键? – 2012-01-29 09:57:55

+0

@simon_,你说这是一个散列,但你继续称它为'$ obj'并且说散列实际上是从它构造而来的。哪一个?如果'$ obj'是一个对象,请使用委托。在代表中放置你需要的任何“魔法”。 (例如'val1 => sub {my $ self = shift; my $ obj = $ self-> obj; ...}') – ikegami 2012-01-29 10:04:45

+0

@simon_,答案已更新。 – ikegami 2012-01-29 10:12:38