my %handler; BEGIN { %handler = ( foo => sub { ref $_[0] eq 'ARRAY' or croak "foo key takes a hashref"; ... }, bar => sub { $_[0] =~ /wibble$/ or croak "bar key must end with 'wibble'"; ... }, ) } sub process_something { my %arg = @_; my @results; while( my ( $elem, $param ) = each %arg ) { push @results, $handler->{ $elem }->( $param ); } }