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::Moose;

use Bread::Board::Container;
use Bread::Board::ConstructorInjection;
use Bread::Board::BlockInjection;
use Bread::Board::Literal;

{
    package DBH;
    use Moose;
    has ['dsn', 'user', 'pass'] => (is => 'ro', required => 1);
}

my $c = Bread::Board::Container->new(
    name     => 'Model',
    services => [
        Bread::Board::ConstructorInjection->new(
            name  => 'schema',
            class => 'My::App::Schema',
            dependencies => {
                dsn  => Bread::Board::Literal->new(name => 'dsn',  value => ''),
                user => Bread::Board::Literal->new(name => 'user', value => ''),
                pass => Bread::Board::Literal->new(name => 'pass', value => ''),
            },
        ),
        Bread::Board::BlockInjection->new(
            name => 'dbh',
            block => sub {
                my $s = shift;
                DBH->new(
                    dsn  => $s->param('dsn'),
                    user => $s->param('user'),
                    pass => $s->param('pass'),
                )
            },
            dependencies => {
                dsn  => Bread::Board::Dependency->new(service_path => 'schema/dsn'),
                user => Bread::Board::Dependency->new(service_path => 'schema/user'),
                pass => Bread::Board::Dependency->new(service_path => 'schema/pass'),
            },
        )
    ]
);

my $s = $c->fetch('dbh');
does_ok($s, 'Bread::Board::Service');

my $dbh = $s->get;
isa_ok($dbh, 'DBH');

done_testing;