my $default= { stackBytes => 4*1024, ..., }; sub getDefault { return $default; } sub new { my $us= shift @_; my $opts= shift @_; if( $opts && ! isa($opts,"HASH") ) { $opts= { code => $opts, args => \@_, }; } my $class= ref($us) || $us; my $proto= ref($us) ? $us : $class->getDefault(); my $self= bless { }, $class; my @configKeys= keys %{ $class->getDefault() }; # add error checking to taste here, # but this conveys the idea @$self{ @configKeys }= @$proto{ @configKeys }; @$self{ keys %$opts }= values %$opts; return $self; }