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 Test::Requires
    'Log::Dispatch',
    'Log::Dispatch::File',
    'Log::Dispatch::Screen';

use Bread::Board;

my $c = container 'Logging' => as {
    service 'Logger' => (
        block => sub {
            my $s       = shift;
            my $c       = $s->parent;
            my $outputs = $c->get_sub_container('Outputs');
            my $log     = Log::Dispatch->new;
            foreach my $name ( $outputs->get_service_list ) {
                $log->add(
                    $outputs->get_service( $name )->get
                );
            }
            $log;
        }
    );

    container 'Outputs' => as {
        service 'File' => (
            block => sub {
                Log::Dispatch::File->new(
                    name      => 'file',
                    min_level => 'debug',
                    filename  => 'logfile'
                )
            }
        );
        service 'Screen' => (
            block => sub {
                Log::Dispatch::Screen->new(
                    name      => 'screen',
                    min_level => 'warning',
                )
            }
        );
    };
};

my $logger = $c->resolve( service => 'Logger' );
isa_ok($logger, 'Log::Dispatch');

my $screen = $logger->output('screen');
isa_ok($screen, 'Log::Dispatch::Screen');

my $file = $logger->output('file');
isa_ok($file, 'Log::Dispatch::File');

unlink 'logfile';

done_testing;