1#!/usr/bin/perl 2 3use strict; 4use warnings; 5 6use Test::More; 7use Test::Fatal; 8 9use Bread::Board; 10 11{ 12 package My::Simple::Logger; 13 use Moose; 14 15 package My::Database::Logger; 16 use Moose; 17 18 has ['dsn', 'username', 'password'] => ( is => 'ro', isa => 'Str', required => 1 ); 19 20 package My::Application; 21 use Moose; 22 23 has 'log_handle' => ( is => 'ro', isa => 'Object', required => 1 ); 24} 25 26my $simple_logger = container 'SimpleLogger' => as { 27 service 'handle' => ( 28 class => 'My::Simple::Logger' 29 ); 30}; 31isa_ok($simple_logger, 'Bread::Board::Container'); 32 33my $db_conn_info = container 'DatabaseConnection' => as { 34 service 'dsn' => 'dbi:mysql:foo'; 35 service 'username' => 'bar'; 36 service 'password' => '***'; 37}; 38isa_ok($db_conn_info, 'Bread::Board::Container'); 39 40my $db_logger = container 'DatabaseLogger' => [ 'DBConnInfo' ] => as { 41 service 'handle' => ( 42 class => 'My::Database::Logger', 43 dependencies => { 44 dsn => depends_on('DBConnInfo/dsn'), 45 username => depends_on('DBConnInfo/username'), 46 password => depends_on('DBConnInfo/password'), 47 } 48 ); 49}; 50isa_ok($db_logger, 'Bread::Board::Container::Parameterized'); 51 52isnt(exception { 53 $db_logger->fetch('handle') 54}, undef, '... cannot call fetch on a parameterized container'); 55 56my $app = container 'Application' => [ 'Logger' ] => as { 57 service 'app' => ( 58 class => 'My::Application', 59 dependencies => { 60 log_handle => depends_on('Logger/handle') 61 } 62 ); 63}; 64isa_ok($app, 'Bread::Board::Container::Parameterized'); 65 66isnt(exception { 67 $app->fetch('handle') 68}, undef, '... cannot call fetch on a parameterized container'); 69 70isnt(exception { 71 $app->resolve( service => 'handle') 72}, undef, '... cannot call resolve on a parameterized container'); 73 74my $simple_app = $app->create( Logger => $simple_logger ); 75isa_ok($simple_app, 'Bread::Board::Container'); 76 77isa_ok($simple_app->resolve( service => 'app' )->log_handle, 'My::Simple::Logger'); 78 79my $db_app = $app->create( Logger => $db_logger->create( DBConnInfo => $db_conn_info ) ); 80isa_ok($db_app, 'Bread::Board::Container'); 81 82isa_ok($db_app->resolve( service => 'app' )->log_handle, 'My::Database::Logger'); 83 84done_testing; 85