#!/usr/bin/perl use warnings; use strict; package A { sub new { my $classname = shift; my $self = {}; $self->{b} = B->new($self); return bless($self, $classname); } sub say_hello { my $self = shift; print "Hello! Args: ". join(',', @_) ."\n"; } sub pass_sub { my $self = shift; $self->{b}->use_sub_later(); } } package B { sub new { my $classname = shift; my $a = shift; my $self = {}; $self->{a} = $a; return bless($self, $classname); } sub use_sub_later { my $self = shift; my $ready_to_use = 1; if ($ready_to_use) { $self->{a}->say_hello('ARG1', 'ARG2'); } } } my $a = A->new(); $a->pass_sub();