Wenn man global eine Perl-Interne Funktion überschreiben will, z.B. caller(), kann man nicht direkt *CORE::caller{’CODE’}, bzw CORE::GLOBAL::caller, einfach neu definieren. Es gibt Perl-Intern einen Schutzmechanismus, der das ßberschreiben dieser Funktiionen ausschließlich in import()-Funktionen erlaubt.
In Modul ClassA::import() steht der Code, der caller überschreibt.
package ClassA;
sub import {
*CORE::GLOBAL::caller = sub { return 1 };
}
In Modul ClassB muss jetzt ClassA so aufgerufen werden, dass import() verwendet wird:
package ClassB;
use ClassA('*');
print caller();
Und siehe da, es wird ‘1′ ausgegeben. Wenn die Klasse mit z.B. use ClassB() eingebunden wird, und man import direkt im code aufruft, geht es nicht.
package ClassB;
use ClassA();
ClassA::import('*');
print caller();
Die caller() Funktion wird hierbei nicht überschrieben.
Hinweis: die import() Methode, die ja eigentlich ein historischer Unfall ist, scheint mehr Sonderstati zu besitzen. Ein aufruf von use strict in jeglicher import() Methode bewirkt, dass sich das auf das aufrufende Package auswirkt. Das kann fatale nebenwirkungen haben, z.B. bei no strict