=encoding utf8 =head1 NAME ClassLoader - Load Perl classes automatically =head1 SYNOPSIS use ClassLoader; my $obj = My::Class->new; # loads My/Class.pm =head1 DESCRIPTION =head2 Zweck Müde, C-Anweisungen für das Laden von Perl-Klassen zu schreiben? Dieses Modul reduziert das Laden aller Klassen auf eine einzige Anweisung: use ClassLoader; Danach werden alle Klassen automatisch mit ihrem ersten Methodenaufruf geladen. Dies geschieht bei jeder Methode, gleichgültig, ob Klassen- oder Objektmethode. =head2 Vorteile =over 2 =item * Man muss keine C-Aufrufe mehr schreiben =item * Es werden nur die Klassen geladen, die das Programm tatsächlich nutzt =item * Die Startzeit des Programms verkürzt sich, da später benötigte Klassen erst später geladen werden =item * Das Programm benötigt unter Umständen weniger Speicher, da Klassen, die nicht genutzt werden, auch nicht geladen werden =back =head2 Was ist ein Klassen-Modul? Unter einem Klassen-Modul verstehen wir eine .pm-Datei, die gemäß Perl-Konventionen eine Klasse definiert, d.h. die =over 4 =item 1. ein Package mit dem Namen der Klasse deklariert, =item 2. unter dem Namen des Package gemäß den Perl-Konventionen im Dateisystem abgelegt ist, =item 3. ihre Basisklassen (sofern vorhanden) selbständig lädt. =back =head2 Beispiel Eine Klasse I wird in einer Datei mit dem Pfad C definiert und irgendwo unter C<@INC> installiert. Sie hat den Inhalt: package My::Class; use base qw//; 1; Hierbei ist die Liste der Basisklassen und der Quelltext der Klasse (einschließlich der Methodendefinitionen). Das Laden der Basisklassen-Module geschieht hier mittels C. Es ist genauso möglich, die Basisklassen-Module per C oder direkt per C zu laden und ihre Namen C<@ISA> zuzuweisen, was aber umständlicher ist. Eine .pm-Datei, die diesen Konventionen genügt, ist ein Klassen-Modul und wird von I< ClassLoader > automatisch beim ersten Methodenzugriff geladen. =head2 Wie funktioniert das? I< ClassLoader > installiert sich als Basisklasse von I und definiert eine Methode C, bei der sämtliche Methodenaufrufe ankommen, die vom Perl-Interpreter nicht aufgelöst werden können. Die AUTOLOAD-Methode lädt das benötigte Klassen-Modul und ruft die betreffende Methode auf. Existiert das Klassen-Modul nicht oder enthält es die gerufene Methode nicht, wird eine Exception ausgelöst. Die AUTOLOAD-Methode, die I< ClassLoader > definiert, ist recht einfach (Fehlerbehandlung hier vereinfacht): sub AUTOLOAD { my $this = shift; # @_: Methodenargumente my ($class,$sub) = our $AUTOLOAD =~ /^(.*)::(\w+)$/; return if $sub !~ /[^A-Z]/; eval "use $class"; if ($@) { die "Modul kann nicht geladen werden\n"; } unless ($this->can($sub)) { die "Methode existiert nicht\n"; } return $this->$sub(@_); } Lediglich der erste Methodenaufruf einer noch nicht geladenen Klasse läuft über diese AUTOLOAD-Methode. Alle folgenden Methodenaufrufe der Klasse finden I statt, also ohne Overhead! Methodenaufrufe einer explizit geladenen Klasse laufen von vornherein nicht über die AUTOLOAD-Methode. =head2 Was passiert im Fehlerfall? Schlägt das Laden des Moduls fehl oder existiert die Methode nicht, wird eine Exception ausgelöst. Damit der Ort des Fehlers einfach lokalisiert werden kann, enthält der Exception-Text ausführliche Informationen über den Kontext des Fehlers, einschließlich Stacktrace. Aufbau des Exception-Texts: Exception: CLASSLOADER-: Class: Method: () Error: Stacktrace: =head2 Kann eine Klasse selbst eine AUTOLOAD-Methode haben? Ja, denn die AUTOLOAD-Methode von I< ClassLoader > wird I dem Laden der Klasse angesprochen. Alle späteren Methoden-Aufrufe der Klasse werden über die Klasse selbst aufgelöst. Wenn die Klasse eine AUTOLOAD-Methode besitzt, funktioniert diese genau so wie ohne I< ClassLoader >. =head1 METHODS =head2 AUTOLOAD() - Lade Klassen-Modul =head3 Synopsis $this->AUTOLOAD; =head3 Description Die Methode lädt fehlende Klassen-Module und führt ihren ersten Methodenaufruf durch. Die Argumente und der Returnwert entsprechen denen der gerufenen Methode. Schlägt das Laden des Klassen-Moduls fehl, löst die Methode eine Exception aus (siehe oben). Die AUTOLOAD-Methode implementiert die Funktionalität des Moduls ClassLoader. Sie wird nicht direkt, sondern vom Perl-Interpreter gerufen, wenn eine Methode nicht gefunden wird. =head1 CAVEATS =over 2 =item * Der Mechanismus funktioniert nicht, wenn der Modulpfad anders lautet als die Klasse heißt. Solche Module müssen explizit per use geladen werden. =item * Sind mehrere Klassen in einer Moduldatei definiert, kann das automatische Laden logischerweise nur über eine dieser Klassen erfolgen. Am besten lädt man solche Module auch explizit. =item * Über Aufruf der Methode C ist es nicht möglich, ein Modul automatisch zu laden, da Perl bei Nichtexistenz von C C nicht aufruft, sondern den Aufruf ignoriert. Man kann durch $class->import() also nicht das Laden eines Klassen-Moduls auslösen. =item * Module, die nicht objektorientiert, sondern Funktionssammlungen sind, werden von I< ClassLoader > nicht behandelt. Diese sollten per C geladen werden. Es gibt im Perl-Core ein Pragma C, das alternativ zum automatischen Laden von Funktionen verwendet werden kann. =back =head1 VERSION 1.08 =head1 AUTHOR Frank Seitz, L =head1 COPYRIGHT Copyright (C) 2008-2016 Frank Seitz =head1 LICENSE This code is free software. You can redistribute it and/or modify it under the same terms as Perl itself.