#!/usr/bin/perl -w
######################################################################
# autoload.pl
######################################################################
# Perl Power! - Michael Schilli 1998
######################################################################

######################################################################
package Otherclass;            # class to which the Delegate
                               # class delegates methods

sub new {                      # constructor
    my $class = shift;
    bless({}, $class);
}

sub method_delegated {         # method defined here, which
    my $self = shift;          # is used by the Delegate class

    print "Delegated method. Parameters: (@_)\n";
}

######################################################################
package Delegate;              # delegating class

sub new {                      # constructor
    my $class = shift;

    my $self = bless({}, $class);

                               # call constructor of class 
                               # to which method is delegated
    $self->{'delegate'} = Otherclass->new();

    return $self;
}

sub method_defined {           # self-defined method
    my $self = shift;
    print "Own method. Parameters: (@_)\n";
}

sub AUTOLOAD {
    my $self = shift;          # remove erroneous object reference

    $AUTOLOAD =~ s/.*:://;     # remove original
                               # package name

                               # call method in foreign module
                               # with $self->{'delegate'}
                               # as object reference
    $self->{'delegate'}->$AUTOLOAD(@_);
}

######################################################################
package main;                  # main program

$dlgref = Delegate->new();     # create new object of
                               # delegating class

                               # method not defined by
                               # Delegate itself, but
                               # delegated to Otherclass
$dlgref->method_delegated("param1", "param2");

                               # method defined by
                               # Delegate itself
$dlgref->method_defined("param1", "param2");

