#!/usr/bin/perl use warnings; use strict; { package MyCollection; use MooseX::Role::Parameterized; parameter name => ( isa => 'Str', required => 1, ); parameter member_type => ( isa => 'Str', required => 1, ); role { my $p = shift; has $p->name => (is => 'ro', isa => 'ArrayRef[' . $p->member_type . ']'); }; }; { package MyClass; use Moose; with MyCollection => { name => 'list', member_type => 'Int' }; __PACKAGE__->meta->make_immutable; } my $obj = 'MyClass'->new(list => [ 1, 2, 3 ]); my $invalid = 'MyClass'->new(list => [ 1, 2, 3.14 ]); # Throws as 3.14 is not an Int.