2016-05-11 23 views
0

Ich habe Probleme mit dem Attribut Initialisierungsreihenfolge im folgenden:Moose Attribut gesetzt, um Schwierigkeiten

driver.pl

my $foo = MyApp::Boom->new(configfile => "/home/todd/text.cfg"); 

MyApp :: Boom

has configfile => (
    is => 'ro', isa => 'Str', required => 1 
); 

has conf => (
    is => 'ro', isa => 'HashRef', required => 1, lazy => 1, 
    builder => '_build_configuration' 
); 

sub _build_configuration { 
    my $self = shift; 

    unless ($self->configfile) { 
     die "No Configuration File!"; 
    } 
    # stuff that reads the file and creates a hashref 
    return $href; 
} 

has baz => (
    is => 'ro', isa => 'MyApp::Baz', required => 1, lazy => 1, 
    builder => '_build_baz', 
); 

sub _build_baz { 
    my $self = shift; 
    my $conf = $self->conf; 
    # uses data in conf to do stuff and create a MyApp::Baz 
    return MyApp::Baz->new($conf); 
} 

# other stuff omitted.... 

Als ich das laufen driver.pl, bekomme ich manchmal eine Fehlermeldung "No Configuration File" und manchmal funktioniert es. Ich vermisse offensichtlich etwas Wichtiges an 'Faul' und 'Pflicht', kann es aber nicht herausfinden.

Mein Verständnis ist die "Configfile" würde durch den neuen Aufruf in driver.pl gesetzt werden und die Attribute würden initialisiert, wenn anderswo aufgerufen und vermutlich "configfile" wäre bereits festgelegt.

Zeiger, Empfehlungen oder alternative Ansätze sind willkommen.

+0

Dies ist offensichtlich nicht der Code, den Sie ausgeführt haben ... – ikegami

+1

Ich sehe nicht, wie dies möglicherweise sogar manchmal funktioniert, es sei denn, Sie haben einige Methode 'Config' weggelassen, die' $ self> configfile'. Ich denke, es gibt einen einfachen Tippfehler in '_build_configuration()': 'falls ($ self> config)' sollte 'sein, außer ($ self> configfile)'. Abgesehen davon ist das 'required' auf' conf' überflüssig, da es sowieso faul ist, aber es tut auch nicht weh. – mbethke

+1

Es gibt auch den 'sub baz' gegen den automatisch generierten Accessor für die Eigenschaft' baz' und das Fehlen von 'sub _build_baz'. Ich stimme @mbethke zu. Dieser Code ist nicht das, was Sie ausgeführt haben. Bitte schreibe hier keinen neuen Code. Bearbeite deine Frage und zeige deinen ** echten ** Code, oder wir können nicht helfen. – simbabque

Antwort

0

Danke für die Hilfe alle. Ich habe den echten Code zeilenweise durch den Debugger laufen lassen und festgestellt, dass ein Attribut in einer Unterklasse verborgen war, die nicht faul => 1 hatte.