package Bar; use Moose; has x => ( is => 'rw', isa => 'Any' ); sub bar { print "bar", shift->x, "\n"; } package MapDelay; use Moose; use vars '$AUTOLOAD'; has elements => ( is => 'rw', isa => 'ArrayRef' ); around BUILDARGS => sub { my ($orig,$class) = @_; $class->$orig(elements => [splice @_,2]); }; sub AUTOLOAD { (my $m = $AUTOLOAD) =~ s/.*:://; map { $_->$m(@_) } @{shift->elements} }; package Foo; use Moose; sub foo { return MapDelay->new( Bar->new(x=>1), Bar->new(x=>2), Bar->new(x=>3) ); }; package main; Foo->new->foo->bar; #prints bar1\nbar2\nbar3\n