2017-04-23 52 views
2

我試圖添加到Class1Resource1屬性值爲test。 但它不起作用。我的代碼有什麼問題?如何使用perl AUTOLOAD和Moose :: Meta :: Class動態添加一個屬性(如果它不存在)?

package Class1; 
use Moose; 

sub AUTOLOAD { 
    my $self = shift; 
    our $AUTOLOAD; 
    my $unknown_method_name = (split(/::/, $AUTOLOAD))[-1]; 
    require Class2; # generator class 
    Class2->generate_one($self, $unknown_method_name); 
} 


package Class2; 
use Moose; 

sub generate_one { 
    my ($self, $object, $p) = @_; 
    $object->meta->add_attribute(
    $p => { 
     is => 'ro', 
     default => 'test', 
     lazy => 1 
    } 
); 
} 


package main; 
my $a = Class1->new; 
warn $a->Resource1; # must be 'test' but showing Moose::Meta::Attribute=HASH(0x333ca10) 

回答

2

您生成了屬性及其存取器,但您忘記調用存取器。所以代碼在第一次調用時什麼也不返回

更正例如:

sub AUTOLOAD { 
    my $self = shift; 
    our $AUTOLOAD; 
    my $unknown_method_name = (split(/::/, $AUTOLOAD))[-1]; 
    require Class2; # generator class 
    Class2->generate_one($self, $unknown_method_name); 
    return $self->$unknown_method_name(@_); 
} 
+3

解釋幾句話是適當的位置 – Borodin

相關問題