Быстрый поиск Google придумал этот http://en.wikipedia.org/wiki/Delegation_pattern . В основном в любое время то, что Вы используете объект, что вперед это - вызовы к другому объекту тогда, Вы делегируете.
At the end of the module, put:
BEGIN { $INC{'foo/wizzy.pm'} = 1 }
Then code can just say:
use foo::bar;
use foo::wizzy;
to get foo::wizzy's exports.
Во-первых, я считаю полезным использовать закрывающие фигурные скобки для управления областью действия при заполнении нескольких пакетов в один файл. Кроме того, включение пакета в блок BEGIN делает его более похожим на правильное использование
, которое использовалось для его загрузки, но в основном это происходит, если я втиснул пакет в основной сценарий.
use Foo
совпадает с BEGIN {требуется Foo; Foo-> import}
.
Итак, у вас есть два варианта:
BEGIN {Foo :: Whizzy-> import; }
в вашем основном скрипте. Foo :: Bar :: import
trigger Foo :: Whizzy :: import
в вызывающем модуле. В Foo /Bar.pm:[1227 visible) В вашем основном коде:
use Foo::Bar;
# If you don't do a custom import for Foo::Bar, add this line:
BEGIN { Foo::Whizzy->import };
Когда вы вызываете , используйте foo :: bar
, на самом деле происходит следующее:
BEGIN {
require foo::bar;
foo::bar->import;
}
(см. perldoc -f use )
Так что import
никогда не вызывается на foo :: wizzy
. Если вы хотите импортировать и эти символы, вы можете сами вызвать BEGIN {foo :: wizzy-> import}
(после используйте foo :: bar
). Или, как вы сказали, просто разделите эти два пакета на отдельные файлы, которые будут намного более удобочитаемы.
(Кстати, не рекомендуется использовать имена пакетов в нижнем регистре, поскольку они обычно зарезервированы для perl pragmata.)
Вы можете сделать это с помощью метода Exporter export_to_level
, чтобы «основной пакет» повторно экспортировал символы «другого» пакета следующим образом:
sub import {
my $self = shift;
$self->export_to_level(1, @_);
Some::Other::Module->export_to_level(1);
}
, хотя если ] Some :: Other :: Module
делает что-то более сложное, чем «экспорт всего», вам, вероятно, понадобится более изящная обработка для @_
.
Мне действительно нужно спросить , почему ], хотя - я не могу себе представить, как это можно использовать, совместимое со словами «хороший код» :)