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;