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