The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DBIx::FileStore::ConfigFile;
use strict;

use List::Util qw(first);
use File::Spec::Functions qw(catfile); # to concat dirs & filenames portably 
use Config::File;

use DBIx::FileStore::UtilityFunctions qw(get_user_homedir);

use fields qw( vars_hash verbose ); # you can set $obj->{verbose} for debugging

######################################
# my $conf = new DBIx::FileStore::ConfigFile() 
sub new {
    my DBIx::FileStore::ConfigFile $self = shift;
    unless (ref $self) {
        $self = fields::new($self);
    }
    return $self;
}


############################################
# my $hashref = $conf->read_config_file()
#  or
# my $hashref = $conf->read_config_file( "/etc/fdb-alternate.conf" )
sub read_config_file {
    my ($self, $opt_filename) = @_;

    # choose which config file we're going to use
    my $filename = $opt_filename;
    my $user_dotfile = catfile( get_user_homedir(), ".fdbrc" ); # ~/.fdbrc
    my $etc_conffile = "/etc/fdb.conf";
    unless( $filename ) {
        # explicit sub{} like this for perl 5.6.2
        $filename = first( sub { -e }, $user_dotfile, $etc_conffile );
    }

    unless($filename) {
        die ("$0: Can't find config file to open " . 
            "(tried $user_dotfile and $etc_conffile)\n");
    }
    print "$0: reading $filename\n" if $self->{verbose};

    $self->{vars_hash} = Config::File::read_config_file( $filename );

    # sanity check that there's a dbuser passed.
    unless( $self->{vars_hash}->{dbuser} ) {
        warn "$0: Can't find a 'dbuser' setting in $filename\n";
    }

    return $self->{vars_hash};
}

1;

=pod

=head1 NAME

DBIx::FileStore::ConfigFile -- Find and read filestore conf files.

=head1 SYNOPSIS

    my $conf = new DBIx::FileStore::ConfigFile();
    my $hashref = $conf->read_config_file();

    # these are the fields we use, along wth dbpasswd
    print "db: $hashref->{dbname}, user: $hashref->{dbuser}\n";

=head1 DESCRIPTION

Provides interface to read DBIx::FileStore configuration files.

The read_config_file() method reads from the optionally 
passed configuration file, the file .fdbrc in the user's 
home directory , or /etc/fdb.conf, whichever is found first.

=head1 METHODS

=over 4

=item new DBIx::FileStore::ConfigFile();

my $conf = new DBIx::FileStore::ConfigFile();

Returns a new DBIx::FileStore::ConfigFile object.  

=item $conf->read_config_file() 

my $conf_hash = $conf->read_config_file();

my $conf_hash = $conf->read_config_file( $filename )

Returns a hashref with the name/value pairs parsed from 
the configuration file. The settings expected by 
DBIx-Filestore are: dbname, dbuser, and dbpasswd.

If a $filename is passed by the caller, that file is used as 
the configuration file. Otherwise the module uses 
the file .fdbrc in the current user's home directory, 
or /etc/fdb.conf, whichever is found first. 

If no configuration file can be found, the method dies 
with an error message.

=back

=head1 COPYRIGHT

Copyright (c) 2010-2013 Josh Rabinowitz, All Rights Reserved.

=head1 AUTHORS

Josh Rabinowitz

=cut