#!/usr/bin/perl -w
######################################################################
# (c) Michael Schilli 1999
######################################################################

###########################################################
package Otherclass;          # Klasse, an die die Klasse
                             # Delegate Methoden delegiert

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

sub method_delegated {       # Hier definierte Methode, die 
    my $self = shift;        # von der Klasse 'Delegate'
                             # genutzt wird

    print "Delegierte Methode. Parameter: (@_)\n";
}

###########################################################
package Delegate;            # Delegierende Klasse

sub new {                    # Konstruktor
    my $class = shift;

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

                             # Konstruktor der Klasse 
                             # aufrufen, an die 
                             # delegiert wird
    $self->{'delegate'} = Otherclass->new();

    return $self;
}

sub method_defined {         # Selbstdefinierte Methode
    my $self = shift;
    print "Eigene Methode. Parameter: (@_)\n";
}

sub AUTOLOAD {
    my $self = shift;        # Falsche Objektreferenz 
                             # entfernen

    $AUTOLOAD =~ s/.*:://;   # Ursprünglichen Package-
                             # Namen entfernen

                             # Methode in fremdem Modul mit 
                             # $self->{'delegate'} als
                             # Objektreferenz aufrufen
    $self->{'delegate'}->$AUTOLOAD(@_);
}

###########################################################
package main;                # Hauptprogramm 

$dlgref = Delegate->new();   # Neues Objekt der delegie-
                             # renden Klasse anlegen

                             # Methode, die Delegate nicht
                             # selbst definiert, sondern
                             # an Otherclass delegiert.
$dlgref->method_delegated("param1", "param2");

                             # Methode, die Delegate selbst
                             # defininiert.
$dlgref->method_defined("param1", "param2");
