Filter::AutoImport — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
Строка 1: Строка 1:
 
== Название ==
 
== Название ==
  
Filter::AutoImport — фильтр для автообъявления часто используемых переменных в методах.
+
<tt>Filter::AutoImport</tt> — фильтр для автообъявления часто используемых переменных в методах.
  
 
Ссылка на исходный код: [{{SVN|vitaphoto/branch/solstice/lib-sway/Filter/AutoImport.pm|markup}} Filter::AutoImport] ([{{SVN|vitaphoto/branch/solstice/lib-sway/Filter/AutoImport.pm|co}} скачать]).
 
Ссылка на исходный код: [{{SVN|vitaphoto/branch/solstice/lib-sway/Filter/AutoImport.pm|markup}} Filter::AutoImport] ([{{SVN|vitaphoto/branch/solstice/lib-sway/Filter/AutoImport.pm|co}} скачать]).
Строка 8: Строка 8:
  
 
<source lang="perl">
 
<source lang="perl">
use Filter::AutoImport qw($www $self->www $cfg $self->www->config);
+
use Filter::AutoImport [ОПЦИИ] qw($www $self->www $cfg $self->www->config);
 
</source>
 
</source>
  
или
+
Где ОПЦИИ могут содержать:
  
<source lang="perl">
+
;<tt>-file_size_limit => 0x1000000</tt>: лимит размера файла.
use Filter::AutoImport -file_size_limit => 0x1000000, qw($www $self->www $cfg $self->www->config);
+
;<tt>-inherit</tt>: в текущем пакете унаследовать импорты (но не опции!) от текущего значения @ISA.
</source>
+
;<tt>-all_subs</tt>: обработать все функции (sub {}), а не только использующие символ $self.
  
Определяются только те переменные, которые нужны, и только в методах — то есть, функциях, использующих символ $self (обычно my $self = shift).
+
<tt>'''use''' Filter::AutoImport</tt> без аргументов идентичен вызову с 1 опцией <tt>-inherit</tt>.
  
Также можно помнить о том, что последний переданный набор описаний переменных запоминается фильтром, что удобно использовать в подклассах базового класса. То есть, в базовом классе передаём qw($www $self->www $cfg $self->www->config), и все дочерние при сначала use base 'Parent', а потом use Filter::AutoImport получат все те же описания.
+
Определяются только те переменные, которые нужны, по умолчанию только в методах. Методами считаются функции, использующие символ $self (обычно my $self = shift).
  
== Как НЕ надо использовать Filter::AutoImport ==
+
Межимпортные зависимости теперь тоже отслеживаются, т.е. можно писать
 
+
Вот так делать не надо (FIXME):
+
  
 
<source lang="perl">
 
<source lang="perl">
use Filter::AutoImport qw($www $self->www $config $www->config);
+
use Filter::AutoImport qw($cfg $www->config $www $self->www);
 
</source>
 
</source>
  
Потому что на данный момент межимпортные зависимости не отслеживаются.
+
== Как НЕ надо использовать Filter::AutoImport ==
  
Ещё нужно понимать, что если символ, используемый в подстановке, в функции будет определён с более ограниченной областью видимости, чем вся функция, то и импорт попадёт в ту же область видимости.
+
Нужно понимать, что если символ, используемый в подстановке, в функции будет определён с более ограниченной областью видимости, чем вся функция, то и импорт попадёт в ту же область видимости.
  
Также, очевидно, неразумно делать подстановочные выражения дающими побочные эффекты, потому что, строго говоря, порядок их подстановки не определён, хотя и гарантируется, что выражение будет подставлено после определения всех символов, в нём использумых.
+
Также, очевидно, неразумно делать подстановочные выражения дающими побочные эффекты, потому что, строго говоря, порядок их подстановки не определён, хотя и гарантируется, что выражение будет подставлено после первого упоминания всех символов, в нём использумых.
 +
 
 +
Очевидно также, что <tt>Filter::AutoImport</tt> не может выяснять логику работы ваших функций, и поэтому первое упоминание символа, используемое в подстановке, должно содержать присваивание ему значения, пригодного для определения самой подстановки. Иными словами, вместе с <tt>Filter::AutoImport</tt> следующий код не проканает:
 +
 
 +
<source lang="perl">
 +
my $self;
 +
$self = shift;
 +
</source>
  
 
== Зависимости ==
 
== Зависимости ==

Версия 16:04, 15 января 2010

Название

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.