AUTOLOAD maakt het mogelijk om dynamisch aanroepen van niet-bestaande methoden of functies in een pakket te verwerken. Dit is handig voor het maken van proxy-objecten, dynamisch gegenereerde methoden (ORM), het implementeren van lazy loading-logica, enzovoort.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Aanroep van $method met @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Roept AUTOLOAD aan
new, DESTROY waar.Vraag: Zal AUTOLOAD worden aangeroepen als je probeert een niet-bestaande constructor new aan te roepen?
Antwoord: Nee. Perl zoekt de constructor new direct in het pakket en roept AUTOLOAD niet aan als deze niet gevonden wordt. AUTOLOAD wordt alleen aangeroepen bij het aanroepen van gewone methoden, niet bij het proberen een object te creëren via Class->new().
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Fout: Can't locate object method "new" ...
Verhaal In een cryptografische service werd via AUTOLOAD het proxeren van vele soortgelijke methoden geïmplementeerd. Op een dag werd vergeten de situatie met de methode DESTROY te verwerken, wat resulteerde in eindeloze recursieve aanroepen bij het opruimen van objecten, wat leidde tot het afhaken van het script.
Verhaal In ORM werd AUTOLOAD gebruikt voor de magie van toegang tot velden, maar men implementeerde geen correcte waarde-retour als de methode daadwerkelijk ontbrak. Dit zorgde ervoor dat Perl in plaats van "Can't locate..." een verwarrend bericht gaf, en dat bugs zich alleen in productie manifesteerden.
Verhaal Bij het refactoren werd een deel van de echte methoden verwijderd, zodat alle aanroepen via AUTOLOAD gingen. Hierdoor daalde de performance van grote taken scherp (de verwerking van een array van miljoenen objecten duurde 10-15 keer langer dan voor de refactor).