use strict; use warnings; use 5.010; use Test::More; use Test::Deep; my $structure = [ { alpha => 'alpha-foo', beta => 18, gamma => 'opt-bar' }, { alpha => 'alpha-foo', beta => 18 } ]; my $structure_extra = [ { alpha => 'alpha-foo', beta => 18, gamma => 'opt-bar', delta => 'huh' }, { alpha => 'alpha-foo', beta => 18 } ]; my $structure_failing = [ { alpha => 'alpha-foo', beta => 18, gamma => 'copt-bar' }, { alpha => 'alpha-foo', beta => 18 } ]; my %minimal = ( alpha => re('^alpha(.*)'), beta => re('\d+') ); my %optional = ( gamma => re('^opt(.*)') ); my $validator = array_each(superhashof(\%minimal) & subhashof({%minimal, %optional})); cmp_deeply($structure, $validator); cmp_deeply($structure_extra, $validator); cmp_deeply($structure_failing, $validator); done_testing;