my $object1 = new MyClasses::Object1 ( _cgi => new CGI, param1 => '...', param2 => '...', ); $object1->dothis; my $object2 = new MyClasses::Object2 ( _object1 => $object1, param1 => '...', param2 => '...' ); $object2->setsomething; my $object3 = new MyClasses::Object3 ( _object1 => $object1 ); $object3->blah; #### Inside Object2: sub setsomething { my $self = shift; $self->{_object1}->{mode} = 1; } Inside Object3: sub blah { my $self = shift; if ($self->{_object1}->{mode}){ return $self->{_object1}->{_cgi}->param('blah'); } else { return $self->{_object1}->{_cgi}->param('pleh'); } }