Frage zu UNIVERSAL

Frage zu UNIVERSAL

am 17.05.2007 21:39:14 von Ferry Bolhar

Hallo, liebe NG,

ich arbeite mich gerade durch Perl-Code durch, den ich
anpassen und erweitern muss. Leider kann ich denjenigen,
von dem er stammt, nicht mehr fragen, warum er den Code
so geschrieben hat. Speziell irritiert mich hier die Verwendung
von UNIVERSAL. Aber vielleicht könnt ihr euch ja einen
Reim darauf machen. Das Ganze ist ein Modul, das mit

use SnaLib;

geladen wird. Das Modul erlaubt die Verwendung von
Attributen, mit denen man später Variable speziell markieren
kann. Im Zuge der Initialisierung werden u.a. folgende Anweisungen
ausgeführt:

package SnaLib;

*{"SnaLib::UNIVERSAL::MODIFY_${_}_ATTRIBUTES"} =
create_handler() foreach qw(SCALAR ARRAY HASH);

push @UNIVERSAL::ISA, 'SnaLib::UNIVERSAL' unless
grep /SnaLib::UNIVERSAL/, @UNIVERSAL::ISA;

So. create_handler liefert eine Referenz auf eine Funktion zur
Verarbeitung der durch das Modul bereitgestellten Attribute
zurück. Die Schleife bewirkt, dass die drei Funktionen

MODIFY_SCALAR_ATTRIBUTES
MODIFY_ARRAY_ATTRIBUTES
MODIFY_HASH_ATTRIBUTES

angelegt werden. Der Core ruft dann diese Funktionen auf,
wenn z.B.

my $x:SnaLib(Xpt1);
my @x:SnaLib(Xpt2);
my %x:SnaLib(Xpt3);

deklariert wird. Soweit ist noch alles klar.

Was ich nicht verstehe ist die Verwendung von UNIVERSAL
bzw. @UNIVERSAL::ISA. Ich dachte, UNIVERSAL bzw.
@ISA sei nur bei Vererbung von Methoden relevant? Hier wird
aber doch überhaupt nicht mit Methoden bzw. Objekten gearbeitet,
sondern mit Attributhandlern! Und was ist der Zweck des
Packages "SnaLib::UNIVERSAL"? Ich habe das "UNIVERSAL"
weggelassen und keine Änderung bemerkt.
Und wozu das "push @UNIVERSAL::ISA"? Ich dachte, im
Package UNIVERSAL wird _immer_ nachgesehen, wenn eine
Methode sonst nicht gefunden wird. Hätte es da es nicht genügt,
die Attributhandler gleich als

UNIVERSAL::MODIFY_${_}_ATTRIBUTES

zu deklarieren? Wer kann das erklären?

Schöne Grüße aus Wien,

Ferry

Re: Frage zu UNIVERSAL

am 17.05.2007 22:39:19 von Frank Seitz

Ferry Bolhar wrote:

> Was ich nicht verstehe ist die Verwendung von UNIVERSAL
> bzw. @UNIVERSAL::ISA. Ich dachte, UNIVERSAL bzw.
> @ISA sei nur bei Vererbung von Methoden relevant? Hier wird
> aber doch überhaupt nicht mit Methoden bzw. Objekten gearbeitet,
> sondern mit Attributhandlern!

Attributhandler sind meines Wissens Methoden. D.h. sie
werden entlang der @ISA-Hierarchie gesucht.

> Und was ist der Zweck des
> Packages "SnaLib::UNIVERSAL"? Ich habe das "UNIVERSAL"
> weggelassen und keine Änderung bemerkt.

Wie Du das Kind nennst ist sicherlich egal. Wenn Du den
Klassennamen konsistent änderst, sollte
der Code weiterhin funktionieren.

> Und wozu das "push @UNIVERSAL::ISA"?

Der Autor macht seine Klasse zu einer Basisklasse von
UNIVERSAL. Tja. Interessanter Einfall.

> Ich dachte, im
> Package UNIVERSAL wird _immer_ nachgesehen, wenn eine
> Methode sonst nicht gefunden wird. Hätte es da es nicht genügt,
> die Attributhandler gleich als
>
> UNIVERSAL::MODIFY_${_}_ATTRIBUTES
>
> zu deklarieren?

Sehe ich auch so. Vielleicht war es ihm nicht geheuer,
in UNIVERSAL selbst herumzumusen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel