Qiang has asked for the wisdom of the Perl Monks concerning the following question:

hello,

I am using Conf.pm to get my config values. it is tidious to copy the same Conf.pm for each of my app and the only different is the config file path. so i would like to creat e a base Conf.pm and abstract out the config file part from sub load_config {}(probably by subclassing BaseConf) . this will allow me to provide different config path for different app easily. but i am not sure how to go about it.

the codes are based on the krang Conf.pm https://svn.krangcms.com/trunk/krang/lib/Krang/Conf.pm

anyway, here is my code

package BaseConf; use strict; use warnings; use Carp qw(croak); use Config::Tiny; my $Conf; sub _load_config { my $conf_file = "/path/to/my.conf"; croak "unable to find $conf_file" unless -e $conf_file and -r $con +f_file; $Conf = Config::Tiny->read( $conf_file ); croak "read config file '$conf_file' failed: $Config::Tiny::errstr +" unless $Conf; } BEGIN { _load_config() } sub get { croak "invalid method called $_[1]" if not exists $Conf->{_}->{ $_ +[1] }; return $Conf->{_}->{ $_[1] }; } sub import { my $pkg = shift; my $callpkg = caller(0); foreach my $name (@_) { no strict 'refs'; # needed for glob refs *{"$callpkg\::$name"} = sub () { $pkg->get( $name ) }; } } 1;
right now i can use it like

use base BaseConf qw/name1 name2/; ...
but i would like to have it subclassed.. maybe like this :

package MyConf; use base BaseConf; sub provide_my_config_path_here {} package main; use MyConf qw/name1 name2/;
ideas?

Replies are listed 'Best First'.
Re: need some OO help
by friedo (Prior) on Mar 26, 2007 at 16:45 UTC

    Just put an empty ("abstract") method in your base class, which your subclasses will use to get the path.

    package BaseConf; my $Conf; sub _load_config { my $self = shift; my $conf_file = $self->config_file_path; croak "unable to find $conf_file" unless -e $conf_file and -r $conf_file; $Conf = Config::Tiny->read( $conf_file ); croak "read config file '$conf_file' failed: $Config::Tiny::errstr" unless $Conf; } sub config_file_path { croak "config_file_path must be provided by subclass."; } ... package MyConf; use base 'BaseConf'; sub config_file_path { return '/path/to/conf.file'; }
      thanks. that should fix it except..

      since i am using BEGIN { _load_config() } in base class. how do i get around using the method you suggested?

        Put it in your derived class instead (and turn it into a class method.)

        package MyConf; ... BEGIN { __PACKAGE__->_load_config; }

        That will call _load_config (as a method) in your parent class, which will call config_file_path in your child class.