AUTOLOAD permet de gérer dynamiquement les appels à des méthodes ou fonctions inexistantes dans un package. C'est pratique pour créer des objets proxy, des méthodes générées dynamiquement (ORM), pour l'injection de logique de chargement paresseux, etc.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Appelé $method avec @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Appellera AUTOLOAD
new, DESTROY.Question : AUTOLOAD sera-t-il appelé si vous essayez d'appeler un constructeur inexistant new ?
Réponse : Non. Perl recherche le constructeur new directement dans le package et n'appelle pas AUTOLOAD pour cela s'il n'est pas trouvé. AUTOLOAD est appelé uniquement lors de l'appel de méthodes ordinaires, et non lors de la tentative de création d'un objet via Class->new().
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Erreur : Can't locate object method "new" ...
Histoire Dans un service de cryptographie, l'autoloading a été utilisé pour le proxy de nombreux méthodes similaires. Un jour, ils ont oublié de traiter la situation avec la méthode DESTROY, et lors de la finalisation des objets, d'appels récursifs infinis ont provoqué l'échec du script.
Histoire Dans l'ORM, « AUTOLOAD » a été utilisé pour la magie d'accès aux champs, mais ils n'ont pas implémenté le retour correct de la valeur si la méthode était vraiment absente. En conséquence, perl a fourni un message confus au lieu de « Can't locate... », et les bogues se manifestaient uniquement en production.
Histoire Lors d'une refonte, une partie des vraies méthodes a été retirée, donc tous les appels sont passés par
AUTOLOAD. Cela a fait chuter brutalement les performances des grandes tâches (le traitement d'un tableau de millions d'objets est devenu 10 à 15 fois plus lent qu'avant la refonte).