package My::Types; use strict; use warnings; use MooseX::Types -declare => [qw(Measure MeasureType MeasureUnit some other types)]; use MooseX::Types::Moose qw(Num Int Str); use MooseX::Types::Structured qw(Dict); use List::MoreUtils qw(any); my @measure_types = qw(some data here); my @measure_units = qw(and here); subtype MeasureType, as Str, where { my $measure_type = $_; any { $measure_type eq lc } @measure_types }, message { 'Unknown measure type' }; subtype MeasureUnit, as Str, where { my $measure_unit = $_; any { $measure_unit eq lc } @measure_units }, message { 'Unknown measure unit' }; subtype Measure, as Dict[ type => MeasureType, from => MeasureUnit, to => MeasureUnit, amount => Num, ], message { 'Invalid Measure struct' }; # more subtypes goes here