AUTOLOAD permite manejar dinámicamente las llamadas a métodos o funciones que no existen en un paquete. Esto es conveniente para crear objetos proxy, métodos generados dinámicamente (ORM), implementar lógica de carga perezosa, etc.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Llamado $method con @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Llamará a AUTOLOAD
new, DESTROY.Pregunta: ¿Se llamará a AUTOLOAD si se intenta llamar a un constructor inexistente new?
Respuesta: No. Perl busca el constructor new directamente en el paquete y no llama a AUTOLOAD para él si no se encuentra. AUTOLOAD solo se llama al invocar métodos normales, no al intentar crear un objeto a través de Class->new().
package Foo; sub AUTOLOAD { print "¡AUTOLOAD! "; } # $obj = Foo->new(); # Error: Can't locate object method "new" ...
Historia En un servicio criptográfico, a través de AUTOLOAD se implementó el proxisado de muchos métodos similares. Una vez olvidaron manejar la situación con el método DESTROY, y al finalizar objetos surgieron llamadas recursivas infinitas, lo que llevó a la caída del script.
Historia En el ORM usaron AUTOLOAD para la magia de acceso a campos, pero no implementaron un regreso correcto de valores si el método realmente no existía. Debido a esto, Perl en lugar de "Can't locate..." daba un mensaje confuso, y los errores se manifestaban solo en producción.
Historia Al refactorizar, eliminaron parte de los métodos reales, así que todas las llamadas pasaron a través de AUTOLOAD. Como resultado, el rendimiento de tareas grandes disminuyó drásticamente (el procesamiento de un array de millones de objetos se volvió 10–15 veces más lento que antes de la refactorización).