2016-02-04 4 views
0
############################################################################### 
# Attributes 
############################################################################### 
has 'primary_cluster' => (
    is => 'ro', 
    isa => 'Str', 
    required => TRUE, 
); 

has 'secondary_cluster' => (
    is => 'ro', 
    isa => 'Str', 
    required => FALSE, 
    default => sub {$_[0]->primary_cluster}, 
); 

has '_connection' => (
    is => 'ro', 
    required => FALSE, 
    init_arg => undef, 
    default => sub { 
     Core::mConnection->new(
      primary_cluster => $_[0]->primary_cluster, 
      secondary_cluster => $_[0]->secondary_cluster, 
     ); 
    }, 
); 

Я пытаюсь получить частный атрибут _connection, который использует другие атрибуты для создания объекта mConnection. Проблема, с которой я столкнулся, заключается в том, что внутри подпрограммы по умолчанию _connection, $_[0]->primary_cluster всегда является undef. Есть ли способ гарантировать порядок создания атрибута или есть лучший способ сделать это?Как один дополнительный атрибут атрибута по умолчанию может быть связан с Moose?

Я не хочу, чтобы этот атрибут был ленивым; Мне нужно, чтобы он был создан, когда объект построен.

ответ

2

Объект все еще строится! Завершите инициализацию вашего атрибута до тех пор, пока он не будет создан. следующие задерживает инициализацию, пока она не используется:

lazy => 1 

Вы также можете использовать метод BUILD вместо default.

sub BUILD { 
    my $self = shift; 

    $self->_connection(
     Core::mConnection->new(
     primary_cluster => $self->primary_cluster, 
     secondary_cluster => $self->secondary_cluster, 
    ) 
    ); 
} 

Конечно, вам необходимо сделать атрибут для записи первым.