我可以使用基于Moose的对象将正则表达式传递给isa()吗?

时间:2010-03-13 22:16:27

标签: perl moose isa

我可以使用正则表达式作为参数在Moose中使用isa吗?如果不可能,我可以使用->isa之外的其他内容实现相同的目标吗?

好的,拥有以下类型Animal::GiraffeAnimal::Carnivore::Crocodile,我想->isa(/^Animal::/),我可以这样做吗?如果我不能,我可以用什么来达到预期的效果?

4 个答案:

答案 0 :(得分:8)

这些相关类型应该“扮演”相同的角色,动物。然后你可以写:

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

现在你有一些比正则表达式更可靠的东西来确保程序的一致性。

答案 1 :(得分:4)

Leon Timmermans的回答与我的建议很接近,虽然我使用的是Moose :: Util :: TypeConstraints

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

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

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

答案 2 :(得分:4)

扩展perigrin的答案,这样如果类在其超类中的任何位置都有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建议使用角色有很多优点,但如果你想这样做,你可以覆盖所有的基础。

答案 3 :(得分: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:除非你有一个令人信服的理由,否则你应该使用继承。