use strict; use warnings; use Test::More 'no_plan'; package Base1; { use Object::InsideOut; sub foo :Cumulative :MergedArgs { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Base2; { use Object::InsideOut qw(Base1); sub foo :Cumulative :MergedArgs { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Base3; { use Object::InsideOut qw(Base1); sub foo :Cumulative :MergedArgs :Restricted( 'Outside', '') { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Base4; { use Object::InsideOut; sub foo :MergedArgs # but not Cumulative! { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Der1; { use Object::InsideOut qw(Base2 Base3 Base4); sub foo :Cumulative :MergedArgs { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Der2; { use Object::InsideOut qw(Base2 Base3 Base4); sub foo :Cumulative :MergedArgs { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } } package Reder1; { use Object::InsideOut qw(Der1 Der2); sub foo :Cumulative :MergedArgs { my ($self, $args) = @_; my $pkg = __PACKAGE__; return ($args->{$pkg}); } sub get_foo { my $self = shift; return ($self->foo(@_)); } } package Outside; { use Object::InsideOut; sub bar { my $self = shift; my $obj = shift; return ($obj->foo(@_)); } } package main; MAIN: { my $obj = Reder1->new(); eval { $obj->foo() }; like($@, qr/restricted method/ => ':Restricted + :Cumulative'); my @expected = ('foo', 'bar', 'baz', 'bing', 'bang', 'bong'); my @got = $obj->get_foo( 'Base1' => 'foo', { 'Base2' => 'bar', }, { 'Base3' => 'baz', 'Der1' => 'bing', }, 'Der2' => 'bang', { 'Reder1' => 'bong', } ); is_deeply(\@got, \@expected => 'Cumulative methods with merged args'); my $out = Outside->new(); @got = $out->bar($obj, 'Base1' => 'foo', { 'Base2' => 'bar', }, { 'Base3' => 'baz', 'Der1' => 'bing', }, 'Der2' => 'bang', { 'Reder1' => 'bong', } ); is_deeply(\@got, \@expected => 'Cumulative methods with merged args'); } exit(0); # EOF