use everywhere

| Комментариев: 3

Те, кто активно пользуются версией Perl 5.10, каждый раз пишут в начале файла инструкцию use v5.10 (в разных вариантах) или use Modern::Perl.

Брок Вилкокс создал (еще в августе 2009-го) модуль-прагму everywhere, и в документации прямо пишет о том, что сделал это для того, чтобы не писать надоедливые use 5.010.

Если вставить инструкцию everywhere до подключения других модулей, то ее аргумент автоматически превращается в соответсвующий вызов use внутри подключенных файлов.

use everywhere q(feature ':5.10');
use MyModule;

MyModule->my_sub($$);

Соответственно, внутри MyModule.pm теперь возможно использовать фичи 5.10:

package MyModule;

sub my_sub {
    say $_[1];
}

1;

Помимо 5.10 удается подключать и любые другие модули и прагмы. В документации, к примеру, упомянут вариант

use everywhere 'MooseX::Declare';

При попытке написать

use everywhere 'v5.10';

или

use everywhere '5.10.1';

появляется предупреждение о том, что v-string in use/require non-portable. Это удается обойти, написав переносимую (хотя и менее понятную человеку) конструкцию

use everywhere '5.010';

В качестве шутки можно избавиться от предупреждения и таким образом:

use v5.10;
use everywhere 'v5.10';

Комментариев: 3

In a project I have, all the packages for the project are in the EPFarms:: namespace. So the main EPFarms.pm module contains this:

use everywhere 'MooseX::Declare; use 5.010',
  matching => '^EPFarms',
  use_here => 1;

and then each individual package within that namespace gets 5.10 goodness and MooseX::Declare. So individual packages start right off with declaring their class -- no other header mumbo jumbo (not even a use strict!) at the top of every single file. Fun!

I think that 'everywhere' could use a few improvements. For one, it seems that you can only use it once (hence my use of the ; in the above example) :)

Возможно это удобно, если вы пишите и код и модули. Но я бы не стал в реальном проекте это использовать, т.к. это нарушает инкапсуляцию модулей. Теперь что бы использовать модуль я всегда должен писать use everywhere. Ситуация усложняется если модуль в данный момент не использует 5.10 фичи, и вы забыли написать everywhere в скрипте. А потом кто-то добавляет 5.10 фичу в модуль, и скрипт начинает падать. Этого можно легко избежать, если в каждом модуле явно указывать его зависимости.

Обилие подобных модулей говорит, что "маразм крепчает".
use 5.010. писать надоело, а use everywhere q(feature ':5.10'); - не надоест. Странно. Стоит настроить редактор, а не плодить кучу модулей.

Комментировать

Страницы

  • img

Об этой записи

Сообщение опубликовано 18.02.2010 00:13. Автор — ash.

Предыдущая запись — Perl Mova + YAPC::Russia 2010

Следующая запись — Как включить 5.10

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.