2016-08-12 4 views
2

В следующем фрагменте кода (Perl с Мус), как представляется, бесконечной рекурсии:Как предотвратить бесконечную рекурсию (с лосями)?

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(); 
    } 
} 

Примечание: Model::LazySQLModel является хэш привязан который содержит идентификатор и другие поля БД.

Каков правильный способ сделать это (чтобы избежать бесконечной рекурсии)?

+1

Кажется, что замена 'if ($ self-> id)' с 'if ($ self-> has_id)' является решением – porton

+1

Да. Не стесняйтесь отвечать на свой вопрос. Предикаты не приводят к запуску строителей. – AKHolland

ответ

2

Замена if ($self->id) на if ($self->has_id) является решением проблемы.