2017-04-23 1 views
2

testの値がClass1Resource1の属性に追加しようとしています。 しかし、それは動作していません。私のコードで何が間違っていますか?属性が存在しない場合、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

関連する問題