2012-01-29 21 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

相關問題