package A; has b => ( isa => 'B' ); has c => ( isa => 'C' ); sub BUILD { my ($self) = @_; $self->b(B->new(a => $self)); $self->c(C->new(a => $self)); } package B; has a => ( isa => 'A', required => 1); sub method { my ($self) = @_; $self->a->exec(...); # Stuff related to B } package C; has a => ( isa => 'A', required => 1); sub another_method { my ($self) = @_; $self->a->exec(...); # Stuff related to C }