The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use rlib;
use Test::More tests => 9;
use File::Spec;

# Mock home/config dir location
{
    use File::HomeDir;
    no warnings 'redefine';
    sub File::HomeDir::my_data { return 't'; }
}

my $obj = My::Class->new();
isa_ok($obj, 'My::Class');
can_ok($obj, qw(
    config_dir
    config_file
    config
));
is( $obj->config_dir, 't', 'config_dir attribute resolved correctly' );
is( $obj->config_file, File::Spec->catfile('t', '.my_class.ini'), 'config_file attribute resolved correctly' );
is( ref($obj->config), ref({}), 'config attribute is a hashref' );
is( $obj->username, 'robin', 'required attribute username found in config' );

my $obj2 = My::Class->new( config_file => File::Spec->catfile('t', '.missing.ini') );
is_deeply( $obj2->config, {}, 'missing config file should give empty config' );

my $obj3 = My::Class->new(
    config_files => [
        File::Spec->catfile('t', '.my_class.ini'),
        File::Spec->catfile('t', '.my_other_class.ini'),
    ],
);
is( scalar @{ $obj3->config_files }, 2, "two config files specified" );
is( $obj3->username, 'robin', 'username attribute should come from first file' );

BEGIN {
    package My::Class;
    use Moose;

    # Read configuration from ~/.my_class.ini, available in $self->config
    has 'config_filename' => ( is => 'ro', isa => 'Str', lazy_build => 1 );
    sub _build_config_filename { '.my_class.ini' }
    with 'Config::Role';

    # Fetch a value from the configuration, allow constructor override
    has 'username' => ( is => 'ro', isa => 'Str', lazy_build => 1 );
    sub _build_username { return (shift)->config->{'username'}; }
}