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

use strict;
use warnings;

use Test::More;
use Test::Fatal;

use Bread::Board;

{
    package My::Database::Handle;
    use Moose;

    has ['dsn', 'username', 'password'] => ( is => 'ro', isa => 'Str', required => 1 );
}

my $utils = container 'Utils' => as {
    container 'Database' => [ 'DBConnInfo' ] => as {
        service 'handle' => (
            class        => 'My::Database::Handle',
            dependencies => {
                dsn      => depends_on('DBConnInfo/dsn'),
                username => depends_on('DBConnInfo/username'),
                password => depends_on('DBConnInfo/password'),
            }
        );
    };
};
isa_ok($utils, 'Bread::Board::Container');

my $db_conn_info = container 'DatabaseConnection' => as {
    service 'dsn'      => 'dbi:mysql:foo';
    service 'username' => 'bar';
    service 'password' => '***';
};
isa_ok($db_conn_info, 'Bread::Board::Container');

my $db = $utils->fetch('Database');
isa_ok($db, 'Bread::Board::Container::Parameterized');

isnt(exception {
    $utils->fetch('Database')->fetch('handle');
}, undef, '... cannot fetch on a parameterized container');

isnt(exception {
    $utils->fetch('Database/handle');
}, undef, '... cannot fetch within a parameterized container');

my $dbh = $db->create( DBConnInfo => $db_conn_info )->resolve( service => 'handle' );
isa_ok($dbh, 'My::Database::Handle');

done_testing;