sub foo { my ($self, %opts) = @_; my $foo = delete $opts{foo} // 'default_foo'; my $bar = delete $opts{bar} // croak "required parameter bar missing"; ... %opts and croak_bad_args(\%opts); ... }