빌더

2014-02-06 2 views
1

내에서 메소드를 호출하는 방법은 설정 속성을 가진 클래스가 있습니다.빌더

sub _load { 
    # Assuming laziness is implemented somewhere else. 
    my $self = shift; 
    $self->{_data} = retrieve $self->_file; 
    $self->refresh; # which does something with $self->{_data} 
    return $self->{_data}; 
} 

하지만 무스에서이 작업을 수행 할 수있는 '깨끗한'방법을 알아낼 수 없습니다 구식 펄 OO에서

, 나는 다음과 같은 일을 할 것입니다.

나는 다음을 고려해 보았다.하지만 꽤 못 생겼고 더 나은 방법이 있어야한다고 생각한다. 내가 _data 읽기 - 쓰기를 한 경우

  • , 나는 잠재적 접근에 데이터를 기록 무스 다시 접근에 쓰기위한 방법은 다음 접근에서 값을 반환 호출 할 수 있습니다.
  • 평범한 방법으로 바꾸면 다른 속성을 정의해야합니다 (예 : _raw_data). 데이터를 저장하려면 refresh()을 수정하고 다른 모든 것은 _data()을 사용하십시오.
  • 캡슐화를 위반하고 기본 $self->{_data}에 직접 액세스하십시오.

나는 after '_load' => \&refresh;을 시도했지만 그저 무한 루프를 만들었습니다. 단지 작가/접근 방법에 명시 적으로 생성자에 전달하거나 전달 된 값에 - 기본/내장 값에서 작동하지 않는 트리거를 제외하고

has _data => (
    is  => 'ro', 
    lazy => 1, 
    builder => '_load', 
    trigger => sub { shift->refresh }, 
); 

:

답변

1

이 좋은 트리거를 사용하는 것 . 슬픈 얼굴. :-(

하나 개의 솔루션 대신 $self->_data에서 작동, 그것은 아마도 매개 변수가 지정되지 않은 경우 $self->_data에서 작동 다시 하락 (매개 변수를 받아 들일 수 있도록 refresh 방법을 재 작성하는 것입니다.

sub _load { 
    my $self = shift; 
    my $tmp = retrieve $self->_file; 
    $self->refresh($tmp); 
    return $tmp; 
} 

sub refresh { 
    my $self = shift; 
    my $data = scalar(@_) ? $_[0] : $self->_data; 
    # do something with $data 
}