package Old; sub new { my ($class,@arg) = @_; my $self = {}; return bless $self,$class; } # pretend these return HTML pages generated via CGI.pm sub index { "CGI.pm index page" } sub page1 { "CGI.pm page1" } sub page2 { "CGI.pm page2" } sub page3 { "CGI.pm page3" } 1; #### package New; sub new { my ($class,@arg) = @_; my $self = {}; return bless $self,$class; } # pretend these return HTML pages generated via HTML::Template sub index { "H::T index page" } sub page2 { "H::T page2" } # page 2 was easier than 1 ;) 1; #### package Interface; use Old; use New; sub new { my ($class,@arg) = @_; my $self = {}; return bless $self,$class; } sub index { return New->new()->index } sub page1 { return Old->new()->page1 } sub page2 { return New->new()->page2 } sub page3 { return Old->new()->page3 } 1; #### use strict; use warnings; use Interface; my $obj = Interface->new; print $_,$/ for map $obj->$_, qw(index page1 page2 page3); #### package Interface; use Old; use New; use Carp; sub new { my ($class,@arg) = @_; my $self = {}; return bless $self,$class; } my %new = map {$_ => 1} qw(index page3 page2); sub AUTOLOAD { my $self = shift; my $name = $AUTOLOAD; $name =~ s/.*://; # strip fully-qualified portion #TODO: method name validation! return $new{$name} ? eval "New->new->$name" : eval "Old->new->$name" ; } sub DESTROY {} # good practice - prevents unecessary call to AUTOLOAD 1;