package Some::Object; use strict; use warnings; use Carp; our $VERSION = '0.01'; sub new { my $class = shift; my $self = bless {}, $class; croak "Incorrect number of parameters" if @_ % 2; $self->_init(@_); return $self; } sub _init { my $self = shift; my %default = ( foo => 'bar', blah => 'asdf', ); my %user = @_; for ( keys %user ) { delete $user{$_} if ! exists $default{$_}; } for ( keys %default ) { $user{$_} = $default{$_} if ! exists $user{$_}; } $self->{OPT} = \%user; }