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