AUTOLOAD позволяет динамически обрабатывать вызовы несуществующих методов или функций в пакете. Это удобно для создания прокси-объектов, динамически генерируемых методов (ORM), внедрения ленивой загрузки logики и пр.
AUTOLOAD:package MyAuto; sub AUTOLOAD { our $AUTOLOAD; my ($self, @args) = @_; my ($method) = $AUTOLOAD =~ /::(\w+)$/; print "Вызван $method c @args "; } package main; my $obj = bless {}, 'MyAuto'; $obj->any_method(1,2,3); # Вызовет AUTOLOAD
new, DESTROY.Вопрос: Будет ли вызван AUTOLOAD, если попытаться вызвать несуществующий конструктор new?
Ответ: Нет. Perl ищет конструктор new непосредственно в пакете и не вызывает AUTOLOAD для него, если он не найден. AUTOLOAD вызывается только при вызове обычных методов, а не при попытке создания объекта через Class->new().
package Foo; sub AUTOLOAD { print "AUTOLOAD! "; } # $obj = Foo->new(); # Ошибка: Can't locate object method "new" ...
История В криптографическом сервисе через AUTOLOAD реализовали проксирование множества однотипных методов. Однажды забыли обработать ситуацию с методом DESTROY, и при финализации объектов возникли бесконечные рекурсивные вызовы, приводившие к падению скрипта.
История В ORM использовали AUTOLOAD для магии доступа к полям, но не реализовали корректный возврат значения, если метод действительно отсутствует. Из-за этого perl вместо "Can't locate..." выдавал путаное сообщение, а баги проявлялись только в продакшене.
История При рефакторинге убрали часть настоящих методов, так что все вызовы пошли через AUTOLOAD. Из-за этого резко упала производительность крупных задач (обработка массива из миллионов объектов стала в 10–15 раз дольше, чем до рефакторинга).