Filter::AutoImport

Материал из YourcmcWiki
Версия от 15:42, 20 июня 2016; VitaliyFilippov (обсуждение | вклад) (Массовая правка: замена Категория:Разработка на Категория:Архив, замена Category:Разработка на Категория:Архив)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Название

Filter::AutoImport — фильтр для автообъявления часто используемых переменных в методах.

Ссылка на исходный код: Filter::AutoImport (скачать).

Как надо использовать Filter::AutoImport

use Filter::AutoImport [ОПЦИИ] qw($www $self->www $cfg $self->www->config);

Где ОПЦИИ могут содержать:

-file_size_limit => 0x1000000
лимит размера файла.
-inherit
в текущем пакете унаследовать импорты (но не опции!) от текущего значения @ISA.
-all_subs
обработать все функции (sub {}), а не только использующие символ $self.

use Filter::AutoImport без аргументов идентичен вызову с 1 опцией -inherit.

Определяются только те переменные, которые нужны, по умолчанию только в методах. Методами считаются функции, использующие символ $self (обычно my $self = shift).

Межимпортные зависимости теперь тоже отслеживаются, т.е. можно писать

use Filter::AutoImport qw($cfg $www->config $www $self->www);

Как НЕ надо использовать Filter::AutoImport

Нужно понимать, что если символ, используемый в подстановке, в функции будет определён с более ограниченной областью видимости, чем вся функция, то и импорт попадёт в ту же область видимости.

Также, очевидно, неразумно делать подстановочные выражения дающими побочные эффекты, потому что, строго говоря, порядок их подстановки не определён, хотя и гарантируется, что выражение будет подставлено после первого упоминания всех символов, в нём использумых.

Очевидно также, что Filter::AutoImport не может выяснять логику работы ваших функций, и поэтому первое упоминание символа, используемое в подстановке, должно содержать присваивание ему значения, пригодного для определения самой подстановки. Иными словами, вместе с Filter::AutoImport следующий код не проканает:

my $self;
$self = shift;

Зависимости

Фильтр основан на использовании библиотеки PPI. Также требуются модули Filter::Util::Call, Carp и Scalar::Util.