Как передаются параметры модуля perl при его использовании?

Вот пример того, что я имею в виду

use SOAP::Lite +trace => [ qw( debug ) ];

Итак, что такое +trace в SOAP:: Lite? Я предполагаю, что это часть хэша с охватом пакетов? Я имею в виду, если бы я хотел реализовать аналогичный синтаксис в одном из моих модулей, как бы я это сделал?

Как это будет работать, если мне также понадобится импортировать символы, например.

use Foo qw( some_function );

Будет ли это работать?

use Foo qw( some_function ) +option => 'bar';

нужна ли какая-либо дополнительная магия в модуле, который позволяет передавать такие вещи?

Примечание: не уверен, что мне нравится название вопроса, не стесняйтесь переделывать

Ответ 1

Когда вы выполняете use Foo @args, то, что происходит за кулисами, эквивалентно этому:

BEGIN { 
    require 'Foo.pm';
    Foo->import( @args );
};

Итак, в этом случае use SOAP::Lite +trace => [ qw( debug ) ] превращается в вызов import следующим образом:

SOAP::Lite->import( '+trace' => [ 'debug' ] );

Точно как один реализует подпрограмму import до автора модуля. Большинство модулей используют стандартный import, предоставляемый Exporter, но вы можете поместить все, что хотите, и оно будет выполнено в use.