Могу ли я передать регулярное выражение в isa () с объектами на основе Moose? - PullRequest
4 голосов
/ 14 марта 2010

Могу ли я использовать isa в Moose с регулярным выражением в качестве параметра? Если это невозможно, могу ли я достичь того же с чем-то, кроме ->isa?

хорошо, имея следующие типы Animal::Giraffe, Animal::Carnivore::Crocodile, я хочу сделать ->isa(/^Animal::/), я могу это сделать? если я не могу, что я могу использовать для достижения желаемого эффекта?

Ответы [ 4 ]

8 голосов
/ 14 марта 2010

Все эти связанные типы должны «выполнять» одну и ту же роль, Животное. Тогда вы можете написать:

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

Теперь у вас есть нечто гораздо более надежное, чем регулярное выражение, для обеспечения согласованности вашей программы.

4 голосов
/ 14 марта 2010

Расширение ответа Перигрина, чтобы он работал, если у класса есть 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 использовать вместо этого имеет много достоинств, но если вы хотите пойти по этому пути, вы могли бы также охватить все базы.

4 голосов
/ 14 марта 2010

Ответ Леона Тиммерманса был близок к тому, что я бы предложил, хотя я бы использовал сахар из Moose :: Util :: TypeConstraints

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

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

has animal => ( is => 'rw', isa => 'Animal' );
1 голос
/ 14 марта 2010

Я думаю, что это должно сделать.

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

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

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

ETA: Я согласен с jrockway: если у вас нет убедительной причины, вам следует просто использовать наследование.

...