2016-08-12 9 views
2

Im folgende Codefragment (Perl mit Moosen) Es scheint eine unendliche Rekursion zu sein:Wie verhindert man unendliche Rekursion (mit Moose)?

has 'ORM' => (is  => 'ro', 
       isa  => 'Model::LazySQLModel', 
       lazy => 1, 
       builder => 'ORM_builder'); 

has 'id' => (is  => 'ro', 
       isa  => 'Int', 
       lazy  => 1, 
       builder => 'id_builder', 
       predicate => 'has_id', 
      ); 

sub id_builder { $_[0]->ORM->id } 

sub ORM_builder { 
    my ($self) = @_; 

    # FIXME: looks like infinite recursion 
    if ($self->id) { 
    return $self->ORM_find(); 
    } else { 
    return $self->ORM_insert(); 
    } 
} 

Bemerkung: Model::LazySQLModel ist ein Hash-gebunden, die ID und andere Felder DB hält.

Was ist der richtige Weg (um sicher zu sein, dass wir eine unendliche Rekursion verhindern)?

+1

Es scheint, dass das Ersetzen von 'if ($ self> id)' durch 'if ($ self> has_id)' eine Lösung ist – porton

+1

Yep. Fühlen Sie sich frei, Ihre eigene Frage zu beantworten. Prädikate führen nicht dazu, dass Builder ausgeführt werden. – AKHolland

Antwort

2

Ersetzen if ($self->id) mit if ($self->has_id) ist eine Lösung.

Verwandte Themen