1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More;
7
8use Bread::Board;
9
10{
11    package My::Foo;
12    use Moose;
13}
14
15{
16    # typemap directly getting a service object ...
17    my $c = container 'MyTestContainer' => as {
18        typemap 'My::Foo' => (service 'my_foo' => (class => 'My::Foo'));
19    };
20
21    ok($c->has_type_mapping_for('My::Foo'), '... have a type mapping for My::Foo');
22    is(
23        $c->get_type_mapping_for('My::Foo'),
24        $c->fetch('my_foo'),
25        '... the type mapping for My::Foo is the my_foo service'
26    );
27
28    {
29        my $foo = $c->resolve( service => 'my_foo' );
30        isa_ok($foo, 'My::Foo');
31    }
32    {
33        my $foo = $c->resolve( type => 'My::Foo' );
34        isa_ok($foo, 'My::Foo');
35    }
36}
37
38{
39    # typemap mapping to a service object name ...
40    my $c = container 'MyTestContainer' => as {
41        service 'my_foo' => (class => 'My::Foo');
42        typemap 'My::Foo' => 'my_foo';
43    };
44
45    ok($c->has_type_mapping_for('My::Foo'), '... have a type mapping for My::Foo');
46    is(
47        $c->get_type_mapping_for('My::Foo'),
48        $c->fetch('my_foo'),
49        '... the type mapping for My::Foo is the my_foo service'
50    );
51
52    {
53        my $foo = $c->resolve( service => 'my_foo' );
54        isa_ok($foo, 'My::Foo');
55    }
56    {
57        my $foo = $c->resolve( type => 'My::Foo' );
58        isa_ok($foo, 'My::Foo');
59    }
60}
61
62{
63    # typemap mapping to a service object name
64    # that is a path to a sub-container service
65    my $c = container 'MyTestContainer' => as {
66
67        container 'MyTestSubContainer' => as {
68            service 'my_foo' => (class => 'My::Foo');
69        };
70
71        typemap 'My::Foo' => 'MyTestSubContainer/my_foo';
72    };
73
74    ok($c->has_type_mapping_for('My::Foo'), '... have a type mapping for My::Foo');
75    is(
76        $c->get_type_mapping_for('My::Foo'),
77        $c->fetch('MyTestSubContainer/my_foo'),
78        '... the type mapping for My::Foo is the MyTestSubContainer/my_foo service'
79    );
80
81    {
82        my $foo = $c->resolve( service => 'MyTestSubContainer/my_foo' );
83        isa_ok($foo, 'My::Foo');
84    }
85    {
86        my $foo = $c->resolve( type => 'My::Foo' );
87        isa_ok($foo, 'My::Foo');
88    }
89}
90
91done_testing;
92