subtype 'MyArray::Ents::Level2' => as 'ArrayRef[Str|Num|Int]'; coerce 'MyArray::Ents::Level2' => from 'Str|Num|Int' => via { [ $_ ] }; my $level2_constraint = Moose::Util::TypeConstraints::find_type_constraint( 'MyArray::Ents::Level2'); subtype 'MyArray::Ents' => as 'ArrayRef[MyArray::Ents::Level2]'; coerce 'MyArray::Ents' => from 'ArrayRef[MyArray::Ents::Level2|Str|Num|Int]' => via { [ map $level2_constraint->coerce($_), @$_ ] }; ... isa => 'MyArray::Ents'