use Types::Standard qw( ArrayRef HashRef Any ); use Type::Utils qw( compile_match_on_type ); use Carp qw( croak ); sub process_data { my ($self, $data) = @_; state $matcher = compile_match_on_type ArrayRef, sub { my ($d, $s) = @_; $s->_process_value($_) for @$d }, HashRef, sub { my ($d, $s) = @_; $s->_process_value($_) for values %$d }, Any, sub { croak "Could not grok data" }; $matcher->($data, $self); }