Frage zu UNIVERSAL
am 17.05.2007 21:39:14 von Ferry BolharHallo, 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