package SomePackage; my %fields = ( name => undef ); ## can be a lexical ### here's a new simple accessor sub fields { return %fields }; sub new { my $proto = shift; my $class = ref($proto) || $proto; my %args = @_; ### added this line my %fields = $class->fields; my $self = { _permitted => \%fields, %fields, }; bless($self, $class); foreach my $arg (keys(%args)) { $self->$arg($args{$arg}); } } ## ... elsewhere package Some::Package::Sub; use base 'Some::Package'; ### you needed this line before my %fields = ( name => undef, required => undef ); sub fields { return %fields };