1#!/usr/bin/perl 2 3use strict; 4use warnings; 5 6use Test::More; 7 8use Bread::Board; 9 10{ 11 package FileLogger; 12 use Moose; 13 has 'log_file' => (is => 'ro', required => 1); 14 15 package DBI; 16 use Moose; 17 18 has 'dsn' => (is => 'ro', isa => 'Str'); 19 has 'username' => (is => 'ro', isa => 'Str'); 20 has 'password' => (is => 'ro', isa => 'Str'); 21 22 sub connect { 23 my ($class, $dsn, $username, $password) = @_; 24 $class->new(dsn => $dsn, username => $username, password => $password); 25 } 26 27 package MyApplication; 28 use Moose; 29 has 'logger' => (is => 'ro', isa => 'FileLogger', required => 1); 30 has 'dbh' => (is => 'ro', isa => 'DBI', required => 1); 31} 32 33my $c = container 'MyApp' => as { 34 35 service 'log_file' => "logfile.log"; 36 37 service 'logger' => ( 38 class => 'FileLogger', 39 lifecycle => 'Singleton', 40 dependencies => [ 41 depends_on('log_file'), 42 ] 43 ); 44 45 container 'Database' => as { 46 service 'dsn' => "dbi:sqlite:dbname=my-app.db"; 47 service 'username' => "user"; 48 service 'password' => "pass"; 49 service 'host' => undef; 50 51 service 'dbh' => ( 52 block => sub { 53 my $s = shift; 54 DBI->connect( 55 $s->param('dsn'), 56 $s->param('username'), 57 $s->param('password'), 58 ) || die "Could not connect"; 59 }, 60 dependencies => wire_names(qw[dsn username password]) 61 ); 62 }; 63 64 service 'application' => ( 65 class => 'MyApplication', 66 dependencies => { 67 logger => depends_on('logger'), 68 dbh => depends_on('Database/dbh'), 69 } 70 ); 71 72}; 73 74my $logger = $c->resolve( service => 'logger' ); 75isa_ok($logger, 'FileLogger'); 76 77is($logger->log_file, 'logfile.log', '... got the right logfile dep'); 78 79is($c->fetch('logger/log_file')->service, $c->fetch('log_file'), '... got the right value'); 80is($c->fetch('logger/log_file')->get, 'logfile.log', '... got the right value'); 81 82is($c->resolve( service => 'Database/host'), undef, '... service where value is undef'); 83 84my $dbh = $c->resolve( service => 'Database/dbh' ); 85isa_ok($dbh, 'DBI'); 86 87is($dbh->dsn, "dbi:sqlite:dbname=my-app.db", '... got the right dsn'); 88is($dbh->username, "user", '... got the right username'); 89is($dbh->password, "pass", '... got the right password'); 90 91my $app = $c->resolve( service => 'application' ); 92isa_ok($app, 'MyApplication'); 93 94isa_ok($app->logger, 'FileLogger'); 95is($app->logger, $logger, '... got the right logger (singleton)'); 96 97isa_ok($app->dbh, 'DBI'); 98isnt($app->dbh, $dbh, '... got a different dbh'); 99 100done_testing; 101