AUTOLOAD permette di gestire dinamicamente le chiamate a metodi o funzioni non esistenti in un pacchetto. Questo è utile per creare oggetti proxy, metodi generati dinamicamente (ORM), inserire logica di caricamento pigro, ecc.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Chiamato $method con @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Chiamerà AUTOLOAD
new, DESTROY.Domanda: Sarà chiamato AUTOLOAD se si tenta di chiamare un costruttore inesistente new?
Risposta: No. Perl cerca il costruttore new direttamente nel pacchetto e non chiama AUTOLOAD per esso, se non viene trovato. AUTOLOAD viene chiamato solo per la chiamata di metodi normali, non quando si tenta di creare un oggetto tramite Class->new().
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Errore: Can't locate object method "new" ...
Storia In un servizio di crittografia attraverso AUTOLOAD è stato implementato il proxying di molti metodi simili. Un giorno è stata dimenticata la gestione della situazione con il metodo DESTROY, e durante la finalizzazione degli oggetti sono emersi chiamate ricorsive infinite, portando al crash dello script.
Storia In ORM si utilizzava AUTOLOAD per la magia di accesso ai campi, ma non è stata implementata una restituzione corretta del valore, se il metodo era realmente assente. A causa di questo, perl invece di "Can't locate..." produceva un messaggio confuso, e i bug si manifestavano solo in produzione.
Storia Durante il refactoring sono stati rimossi alcuni metodi reali, quindi tutte le chiamate sono passate attraverso AUTOLOAD. A causa di ciò, le prestazioni delle grandi attività sono diminuite bruscamente (l'elaborazione di un array di milioni di oggetti è diventata 10-15 volte più lunga rispetto al refactoring).