2010-03-13 3 views
4

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

ok, имеющий следующие типы 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 point of correct, 'does' проверяет состав ролей, а не наследование. Я также согласен с тем, что проверка состава ролей предпочтительнее :) Анально-удерживающий момент. – perigrin

4

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

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

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

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

Эти родственные типы все должны „делать“ ту же роль, Animal. Тогда вы можете написать:

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

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

3

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