2017-04-23 2 views
2

Ich versuche, Class1Resource1 Attribut hinzuzufügen, welcher Wert test ist. Allerdings funktioniert es nicht. Was ist falsch in meinem Code?Wie fügt man ein Attribut dynamisch hinzu, wenn es nicht existiert? Perl AUTOLOAD und 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) 

Antwort

2

Sie haben das Attribut und seinen Accessor generiert, aber Sie haben vergessen, den Accessor aufzurufen. So gibt Code beim ersten Aufruf nichts zurück.

Korrigierte Beispiel:

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

Ein paar Sätze der Erklärung sind hier angemessen – Borodin

Verwandte Themen