#!/usr/bin/env perl use strict; use warnings; use Test::More; use Test::Moose; { package SubContainer; use Moose; use Bread::Board::Declare; has foo_sub => ( is => 'ro', isa => 'Str', value => 'FOOSUB', ); } { package Container; use Moose; use Bread::Board::Declare; has subcontainer => ( traits => ['Container'], is => 'ro', isa => 'SubContainer', ); } { package InlineSubContainers; use Moose; use Bread::Board::Declare; use Bread::Board; has subcontainer => ( traits => ['Container'], is => 'ro', isa => 'Bread::Board::Container', default => sub { container Foo => as { service bar => 'BAR'; }; }, ); has other_subcontainer => ( traits => ['Container'], is => 'ro', isa => 'Bread::Board::Container', default => sub { container Foo => as { service baz => ( block => sub { my $s = shift; "other " . $s->param('other_bar'); }, dependencies => { other_bar => '../subcontainer/bar', }, ); }, }, ); } { package WithDeps; use Moose; use Bread::Board::Declare; has thing => ( is => 'ro', isa => 'Str', value => 'THING', ); has other_thing => ( is => 'ro', isa => 'Str', block => sub { my $s = shift; $s->param('foo_sub'); }, dependencies => ['sub/foo_sub'], ); has sub => ( traits => ['Container'], is => 'ro', isa => 'SubContainer', dependencies => { foo_sub => 'thing', }, ); } with_immutable { { my $c = Container->new; is($c->resolve(service => 'subcontainer/foo_sub'), 'FOOSUB'); isa_ok($c->subcontainer, 'SubContainer'); is($c->subcontainer->foo_sub, 'FOOSUB'); my $c2 = Container->new; isnt($c->subcontainer, $c2->subcontainer); } { my $c = Container->new(subcontainer => SubContainer->new(foo_sub => 'SUBFOO')); is($c->resolve(service => 'subcontainer/foo_sub'), 'SUBFOO'); isa_ok($c->subcontainer, 'SubContainer'); is($c->subcontainer->foo_sub, 'SUBFOO'); } { my $c = InlineSubContainers->new; is($c->resolve(service => 'subcontainer/bar'), 'BAR'); isa_ok($c->subcontainer, 'Bread::Board::Container'); is($c->subcontainer->resolve(service => 'bar'), 'BAR'); is($c->resolve(service => 'other_subcontainer/baz'), 'other BAR'); isa_ok($c->other_subcontainer, 'Bread::Board::Container'); is($c->other_subcontainer->resolve(service => 'baz'), 'other BAR'); } { my $c = WithDeps->new; is($c->resolve(service => 'sub/foo_sub'), 'THING'); is($c->thing, 'THING'); is($c->sub->foo_sub, 'THING'); is($c->other_thing, 'THING'); } { my $c = WithDeps->new(thing => 'GNIHT'); is($c->resolve(service => 'sub/foo_sub'), 'GNIHT'); is($c->thing, 'GNIHT'); is($c->sub->foo_sub, 'GNIHT'); is($c->other_thing, 'GNIHT'); } } 'SubContainer', 'Container', 'InlineSubContainers', 'WithDeps'; done_testing;