Что самый чистый путь состоит в том, чтобы копировать функциональность base/parent.pm для необъектных модулей жемчуга?

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

Короче говоря, я задаюсь вопросом, как сделать, наследование модуля, в пути base.pm/parent.pm делают это для объектно-ориентированных модулей; только для Основанных на средстве экспорта модулей.

Гипотетический пример того, что я имею в виду:

Вот наш сценарий. Это первоначально загрузило Foo.pm и назвало baz () от него, но baz () имеет ужасную ошибку (как мы будем скоро видеть), таким образом, мы будем использовать Local/Patched/Foo.pm теперь, который должен исправить ошибку. Мы делаем это, потому что в этом гипотетическом случае мы не можем изменить Foo (это - cpan модуль при активной разработке, Вы видите), и это огромно (серьезно).

#!/usr/bin/perl

# use Foo qw( baz [... 100 more functions here ...] );
use Local::Patched::Foo qw( baz [... 100 more functions here ...] );
baz();

Вот Foo.pm. Как Вы видите, это экспортирует baz (), который называет qux, который имеет ужасную ошибку, вызывая вещи отказать. Мы хотим сохранить baz и остальную часть Foo.pm, хотя, не делая тонны вставки копии, тем более, что они могли бы измениться позже, из-за Foo, все еще находящегося в разработке.

package Foo;
use parent 'Exporter';
our @EXPORT = qw( baz [... 100 more functions here ...] );
sub baz { qux(); }
sub qux { print 1/0; }            # !!!!!!!!!!!!!
[... 100 more functions here ...]
1;

Наконец, так как Foo.pm используется во МНОГИХ местах, мы не хотим использовать Sub:: Средство экспорта, поскольку это означало бы вставку копии лейкопластырь, прикрепляет ко всем тем многим местам. Вместо этого мы пытаемся создать новый модуль, который действует и похож на Foo.pm, и действительно загружает 99% его функциональности все еще от Foo.pm и просто заменяет ужасный qux sub лучшим.

То, что следует, - то, на что была бы похожа такая вещь, если бы Foo.pm был объектно-ориентирован:

package Local::Patched::Foo;
use parent 'Foo';
sub qux { print 2; }
1;

Теперь это, очевидно, не будет работать в нашем текущем случае, так как parent.pm просто не делает такого рода вещи.

Существует ли чистый и простой метод записать Local/Patched/Foo.pm (использующий какие-либо применимые модули CPAN) способом, который работал бы, за исключением копирования пространства имен функций Foo.pm вручную?

6
задан Axeman 11 August 2010 в 22:18
поделиться