2010-03-13 4 views
4

정규식을 사용하여 Moose에서 isa를 매개 변수로 사용할 수 있습니까? 가능하지 않다면 ->isa 이외의 다른 것을 사용해도 동일한 결과를 얻을 수 있습니까?무스 기반 객체로 정규 표현식을 isa()에 전달할 수 있습니까?

좋아요, 다음 유형이 있습니다. Animal::Giraffe, Animal::Carnivore::Crocodile, ->isa(/^Animal::/)할까요? 할 수 없다면 원하는 효과를 얻기 위해 무엇을 사용할 수 있습니까?

답변

1

나는 이것이 그렇게해야한다고 생각한다.

use Moose; 
use Moose::Util::TypeConstraints; 

my $animal = Moose::Meta::TypeConstraint->new(
    constraint => sub { $_[0] =~ /^Animal::/} 
); 

has animal => (is => 'rw', isa => $animal); 

ETA : 나는 비록 jrockway에 동의 : 당신이 그렇지 않으면 설득력있는 이유가없는 한, 당신은 단지 상속을 사용해야합니다.

+0

Nit-picky 수정 지점은 상속보다 역할 구성을 확인합니다. 나는 또한 역할 구성을 점검하는 것이 바람직하다는 데 동의한다.) 항문 보유력 이상. – perigrin

4

레온 Timmermans '대답은, 내가 무스 :: 백분율에서 설탕 :: TypeConstraints

use Moose; 
use Moose::Util::TypeConstraints; 

subtype Animal => as Object => where { blessed $_ =~ /^Animal::/ }; 

has animal => (is => 'rw', isa => 'Animal'); 
8

이러한 관련 유형이 모두 같은 역할을 "어떻게"해야을 사용하는 거라고하지만 내가 좋을 것 무엇에 가까이 동물. 그럼 당신은 쓸 수 있습니다 :

has 'animal' => (
    is  => 'ro', 
    does  => 'Animal', 
    required => 1, 
); 

지금 당신은 당신의 프로그램의 일관성을 보장하기 위해 훨씬 더 신뢰할 수있는 정규식 이상의 무언가가있다. 내가 생각

use Moose; 
use Moose::Util::TypeConstraints; 

subtype Animal => 
    as Object => 
    where { grep /^Animal::/, $_->meta->linearized_isa }; 

has animal => (is => 'rw', isa => 'Animal'); 

jrockway 년대 :이 클래스는 슈퍼 클래스의 어느 곳 Animal::*이있는 경우 작동 및뿐만 아니라 즉각적인 클래스 이름 (예를 들어 Helper::MonkeyAnimal::Monkey ISA 경우) 수 있도록

3

perigrin의 답변을 확장 대신 역할을 사용하라는 제안에는 많은 장점이 있지만 대신이 방법을 사용하려면 모든 기반을 포괄 할 수 있습니다.