2015-02-03 6 views
2

컴파일 타임 온 전성 검사가 충족되지 않으면로드를 거부하는 모듈이 있습니다. 이런 식으로 뭔가 :역할에 의해 컴파일 시간 온 전성 체크가 제공됩니다.

package TopSecret; 
use Moose; 

die "Only Joe can use this!" unless $ENV{USER} eq 'joe'; 

1; 

지금 내 생각이 역할에 넣어하므로, 여러 개의 모듈로 유사한 전성 검사를 적용하고 싶습니다. 소비하는 모듈은 수표를 조금 사용자 정의하기위한 정보를 제공합니다.

package TopSecret; 
use Moose; 
with 'ForAuthorizedUser'; 

sub authorized_user { 'joe' } 

1; 

문제는 다음과 같습니다 : 어떻게 TopSecret :: AUTHORIZED_USER()는 컴파일시에, ForAuthorizedUser 내에서 행사할 수 그래서 같이 보일 수 있는가? 뭔가가 'authorized_user "가 필요합니다 - 메서드가 존재하는지뿐만 아니라 그것을 실행하고 반환 값을 확인해야한다는 것을 제외하고는"authorized_user "가 필요합니다.

답변

1

여기에서 속성 우선 적용이 적절하다고 생각합니다. 역할에 속성을 선언하고 필수로 표시하지만 정의는 제공하지 않습니다. 그런 다음 역할을 사용하는 모듈은 해당 속성의 값을 제공 할 수 있습니다. 유효성 확인은 일반적으로 BUILD() 서브 루틴에서 수행됩니다.

package ForAuthorizedUser; 
use Moose::Role; 

use Carp qw(croak); # so you can see the line it fails on 

has 'authorized_user' => (
    is  => 'ro', 
    required => 1, 
); 

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

    croak "Only Joe can use this!" 
     unless $self->authorized_user eq 'joe'; 
} 

1; 

지금 ForAuthorizedUser을 소비 모듈에, 당신은 속성의 정의를 공급 :

: 당신은 같은 일을 별도의 모듈에서

package TopSecret; 
use Moose; 
with qw(ForAuthorizedUser); 

has '+authorized_user' => (
    default => 'joe', 
); 

__PACKAGE__->meta->make_immutable; 

을하지만, 다른 이름 (광산)와

package TopSecret2; 
use Moose; 
with qw(ForAuthorizedUser); 

has '+authorized_user' => (
    default => 'hunter', 
); 

__PACKAGE__->meta->make_immutable; 

그런 다음과 같이이를 테스트 할 수 :

use TopSecret; 
use TopSecret2; 

TopSecret->new; # lives 
TopSecret2->new # croaks Only Joe can use this! at constructor TopSecret2::new (defined at Test.pm line 35) line 36. 
+0

니스; 역할에 BUILD 메서드를 제공하는 것을 좋아합니다. 저는이 _quite_가 전체적인 문제를 해결할 것이라고 생각하지 않습니다. 왜냐하면 어떤 일이 TopSecret을 사용하지만 클래스 메서드 만 호출하면 어떻게 될지 모르는 개체 인스턴스화 때까지 온 전성 검사가 수행되지 않기 때문입니다. TopSecret-> TopSecret을 사용하는 모든 클래스에서 new하지만 어떻게 든 강제로 역할을 수행 할 수있는 방법이 있습니까? – gcbenison

+0

무슨 뜻인지 알 겠어. 나는 그것을 제한하는 좋은 방법이 있는지 정말로 모르겠다. #moose on irc.perl.org가 더 좋은 아이디어 일 수 있습니다. –

+0

내가 생각할 수있는 유일한 것은 당신이 ['before'] (https://metacpan.org/pod/distribution/Moose/lib/Moose/Manual/MethodModifiers.pod#Before-and-after- Modifiers) 메소드 수정자를 사용하여 사용자가 권한이 있는지 확인합니다. –