1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
use strict;
use warnings;
use Test::More;
{
package DelegateBar;
use Moo;
sub bar { 'unextended!' }
package Does::DelegateToBar;
use Moo::Role;
has _barrer => (
is => 'ro',
default => sub { DelegateBar->new },
handles => { _bar => 'bar' },
);
sub get_barrer { $_[0]->_barrer }
package ConsumesDelegateToBar;
use Moo;
with 'Does::DelegateToBar';
has bong => ( is => 'ro' );
package Does::OverrideDelegate;
use Moo::Role;
sub _bar { 'extended' }
package First;
use Moo;
extends 'ConsumesDelegateToBar';
with 'Does::OverrideDelegate';
has '+_barrer' => ( is => 'rw' );
package Second;
use Moo;
extends 'ConsumesDelegateToBar';
sub _bar { 'extended' }
has '+_barrer' => ( is => 'rw' );
package Fourth;
use Moo;
extends 'ConsumesDelegateToBar';
sub _bar { 'extended' }
has '+_barrer' => (
is => 'rw',
handles => { _baz => 'bar' },
);
package Third;
use Moo;
extends 'ConsumesDelegateToBar';
with 'Does::OverrideDelegate';
has '+_barrer' => (
is => 'rw',
handles => { _baz => 'bar' },
);
}
is(First->new->_bar, 'extended', 'overriding delegate method with role works');
is(Fourth->new->_bar, 'extended', '... even when you specify other delegates in subclass');
is(Fourth->new->_baz, 'unextended!', '... and said other delegate still works');
is(Second->new->_bar, 'extended', 'overriding delegate method directly works');
is(Third->new->_bar, 'extended', '... even when you specify other delegates in subclass');
is(Third->new->_baz, 'unextended!', '... and said other delegate still works');
done_testing;
|