2016-10-01 2 views
1

Das Folgende ist ein vereinfachtes Beispiel für meinen echten Code:Moo: In Attribute auf einem anderen (langfristigen) Paket

#!/usr/bin/perl 

package X; 
use Moo; 

sub add_attr_for_another_package { 
    my ($package) = @_; 
    eval "package $package"; 
    has 'q' => (is=>'rw', default=>123); 
} 

package Y; 
use Moo; 

X::add_attr_for_another_package('Y'); 

my $obj = Y->new; 
print $obj->q, "\n"; 

Ich versuche, ein Attribut hinzufügen Y aus einer Funktion in Paket X definiert zu verpacken. Das funktioniert nicht:

Bitte helfen, wie kann ich ein Attribut zu einem Paket von einer Methode hinzufügen, die in einem anderen Paket definiert ist.

Sollte ich zu Moose wechseln?

Antwort

3

package betrifft das Paket, in das Code kompiliert wird. Es wird offensichtlich keinen Code beeinflussen, der bereits kompiliert wurde (z. B. der Anruf an has)! Mit anderen Worten, der Aufruf an has muss kompiliert werden, wenn die package Direktive davon betroffen ist.

sub add_attr_for_another_package { 
    my ($package) = @_; 
    eval(" 
    package $package; 
    has 'q' => (is=>'rw', default=>123); 
    return 1; 
    ") 
    or die [email protected]; 
} 
Verwandte Themen