1use Test::Requires 'Moo';
2
3{
4    package Foo;
5
6    use Moo;
7
8    has str => ( is => 'rw', default => '' );
9
10    sub BUILD {
11        my ($self, $args) = @_;
12
13        $self->str($self->str);
14    }
15
16    around str => sub {
17        my ($orig, $self, $val) = @_;
18
19        return $orig->($self) unless defined $val;
20
21        $orig->( $self, 'prefix_'.$val);
22    };
23}
24
25
26# BB was using Class::MOP::class_of to determine
27# the constructor, and that plays havoc with Moo,
28# it seems
29{ package Bar; use Moo; extends 'Foo'; }
30
31{ package Baz; use Moose; extends 'Foo'; }
32
33package main;
34
35use strict;
36use warnings;
37
38use Test::More;
39
40use Bread::Board;
41
42my $c = container 'MyApp' => as {
43    map {
44        service lc $_ => (
45            class => $_,
46            parameters => { str => { optional => 1 } }
47        )
48    } qw/ Foo Bar Baz /
49};
50
51
52subtest $_, \&test_class, $_ for qw/ Foo Bar Baz/;
53
54done_testing;
55
56sub test_class {
57    my $class = shift;
58    my $plain = $class->new({ str => 'foo_plain' });
59    is $plain->str => 'prefix_foo_plain';
60
61    my $bb = $c->resolve( service => lc $class, parameters => { str => 'foo_bb' } );
62    is( $class->new( str => 'foo_plain' )->str => 'prefix_foo_plain', 'plain after resolve' );
63
64    is $bb->str => 'prefix_foo_bb';
65    is $plain->str => 'prefix_foo_plain', 'plain after str';
66
67    $bb->str('foo_bb_setter');
68    is $bb->str => 'prefix_foo_bb_setter';
69
70    my $plain_after_bb = $class->new({ str => 'foo_plain_after_bb' });
71    is $plain_after_bb->str => 'prefix_foo_plain_after_bb';
72
73    is( Foo->new( str => 'foo_plain' )->str => 'prefix_foo_plain', 'Foo untouched' );
74}
75