package A; use B; use C; use strict; sub new { my ($class) = @_; bless {}, $class; } sub make_B { my ($self) = shift; return new B(@_); } sub make_C { my ($self) = shift; return new C(@_); } ### and then, in my script... use A; my $a = A->new(); # $a has all the methods of A my $b = $a->make_B('a', 'b'); # now $b has all the methods of B my $c = $c->make_C('c', 'd'); # and $c has all the methods of C