正規表現をパラメーターとして Moose で isa を使用できますか? 不可能な場合は、以外のもので同じことを達成でき->isa
ますか?
わかりました、次のタイプがあります Animal::Giraffe
、Animal::Carnivore::Crocodile
、やりたいのですが->isa(/^Animal::/)
、できますか? できない場合、目的の効果を得るために何を使用できますか?
これらの関連するタイプはすべて同じ役割を「果たす」必要があります、動物。次に、次のように書くことができます。
has 'animal' => (
is => 'ro',
does => 'Animal',
required => 1,
);
これで、プログラムの一貫性を確保するために、正規表現よりもはるかに信頼性の高いものが得られます。
ペリグリンの答えを拡張して、クラスのスーパークラスのAnimal::*
どこかに、その直接のクラス名だけでなく(たとえば、Helper::Monkey
isaの場合Animal::Monkey
)でも機能するようにします。
use Moose;
use Moose::Util::TypeConstraints;
subtype Animal =>
as Object =>
where { grep /^Animal::/, $_->meta->linearized_isa };
has animal => ( is => 'rw', isa => 'Animal' );
代わりにロールを使用するというjrockwayの提案には多くのメリットがあると思いますが、代わりにこの方法を使用する場合は、すべてのベースをカバーすることをお勧めします。
Leon Timmermansの答えは、Moose :: Util :: TypeConstraintsの砂糖を使用しましたが、私が提案したものに近いものでした。
use Moose;
use Moose::Util::TypeConstraints;
subtype Animal => as Object => where { blessed $_ =~ /^Animal::/ };
has animal => ( is => 'rw', isa => 'Animal' );
これでいいと思います。
use Moose;
use Moose::Util::TypeConstraints;
my $animal = Moose::Meta::TypeConstraint->new(
constraint => sub { $_[0] =~ /^Animal::/}
);
has animal => (is => 'rw', isa => $animal);
ETA: 私は jrockway に同意します。他に説得力のある理由がない限り、継承を使用する必要があります。