В Perl объекты — это, как правило, ссылки на хэши, а "слоты" (slots) — это отдельные поля хэша, хранящие данные объекта. Для экономии кода и динамического создания методов часто используют магический метод AUTOLOAD.
AUTOLOAD позволяет перехватывать вызовы несуществующих методов и динамически реализовывать их "на лету". Пример — автогенерация методов-геттеров и сеттеров:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "No such slot $field" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Опасности:
Чем отличается AUTOLOAD от прямого определения метода? Какие минусы использования AUTOLOAD для всех аксессоров класса?
Ответ: AUTOLOAD работает на этапе выполнения, в отличие от явных методов. Обычно ошибки, связанные с неверным именем метода, проявляются только во время исполнения, а не на этапе компиляции, что усложняет отладку. Пример неправильного использования:
$obj->fop; # вместо foo — не приведёт к ошибке компиляции, попадёт в AUTOLOAD
Лучше явно генерировать методы через eval в компилируемой секции.
История
История
История
В библиотеке для сериализации объектов автонамного генерировались методы через AUTOLOAD, но забыли реализовать специальный DESTROY, в результате при удалении объектов срабатывал AUTOLOAD, появлялись ошибки об отсутствии метода DESTROY и утечка памяти.