{ package Foo; use Moose; use namespace::autoclean; has 'bars' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Bar]', default => sub { [] }, handles => { push_bars => 'push', all_bars => 'elements', }, lazy => 1, ); sub BUILD { my $self = shift; $_->push_foos($self) foreach $self->all_bars; } __PACKAGE__->meta->make_immutable; 1; } { package Bar; use Moose; use namespace::autoclean; has 'foos' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Foo]', default => sub { [] }, handles => { push_foos => 'push', all_foos => 'elements', }, lazy => 1, ); __PACKAGE__->meta->make_immutable; 1; }