I don't really get what is different with Perl and the other scripting languages for types, but check Moose.
E.g. http://search.cpan.org/~ether/Moose-2.1210/lib/Moose/Cookboo...
Quite OK for one of the scripting languages, imho.
has 'employees' => (
is => 'rw',
isa => 'ArrayRef[Employee]'
default => sub { [] },
);