{ my $warning; local $SIG{__WARN__} = sub { $warning = shift; }; Module::do_something($param, $param1); like ($warning, qr/ignoring/, 'param 1 isn't an href, ignored'); } #### sub blah { my %params = @_; ... } #### my $farm = blah(moo => $href, meow => "Phoebe's smelly cat"); #### sub valid_params { my %valid = ( moo => 1, woof => 1, meow => 1, ); return %valid; } sub _validate_params { my %p = @_; my %valid = valid_params(); for (keys %p){ die "$_ isn't a valid param" if ! exists $valid{$_}; } if (exists $p{moo} && ref $p{moo} ne 'HASH'){ die "param 'moo' must be a hash reference"; } } #### sub yell { my %p = @_; _validate_params(%p); ... }