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