package My::App; # ... require Config::IniHash; sub _configuration { my $self = shift; unless ($self->{_configuration}) { require Config::Find; $self->{_config_name} = Config::Find->find(name => 'myapp', mode => 'read'); if ($self->{_config_name} and -e $self->{_config_name}) { $self->{_configuration} = $self->_default_configuration(); } else { $self->{_configuration} = Config::IniHash->new($self->{_config_name}); } } $self->{_configuration}; } sub _default_configuration { my $self = shift; unless ($self->{_default_configuration}) { # Config::IniHash docs don't say that it can take # a glob, but the code does. $self->{_default_configuration} = Config::IniHash->new(\*DATA); } $self->{_default_configuration}; } __DATA__ # defaults go here. [section1] key1=default value 1 key2=default value 2 [section2] key1=default value 2-1 #### my $value = $self->_configuration()->{section1}->{key1} || $self->_default_configuration()->{section1}->{key1};