overriding delegate methods should work
Arthur Axel 'fREW' Schmidt [Fri, 26 Apr 2013 19:04:31 +0000 (14:04 -0500)]
t/sub-and-handles.t [new file with mode: 0644]

diff --git a/t/sub-and-handles.t b/t/sub-and-handles.t
new file mode 100644 (file)
index 0000000..2c96ad7
--- /dev/null
@@ -0,0 +1,59 @@
+use strictures 1;
+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 A;
+
+   use Moo;
+   extends 'ConsumesDelegateToBar';
+   with 'Does::OverrideDelegate';
+
+   has '+_barrer' => ( is => 'rw' );
+
+   package B;
+
+   use Moo;
+   extends 'ConsumesDelegateToBar';
+
+   sub _bar { 'extended' }
+
+   has '+_barrer' => ( is => 'rw' );
+}
+
+is(A->new->_bar, 'extended', 'overriding delegate method with role works');
+is(B->new->_bar, 'extended', 'overriding delegate method directly works');
+
+done_testing;
+