Я сейчас не слишком ясно думаю и, возможно, упускаю из виду нечто простое.Я думал об этом некоторое время и искал, но не могу больше думать о каких-либо разумных поисковых запросах, которые привели бы меня к тому, что я ищу.
Короче, мне интересно, каксделать наследование модуля, как 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 :: Exporter, поскольку это будет означать копирование вставки исправления bandaid во все эти многие места.Вместо этого мы пытаемся создать новый модуль, который действует и выглядит как Foo.pm, и действительно загружает 99% своей функциональности, все еще из Foo.pm и просто заменяет уродливый сабвуфер qux на лучший.
Далее следует, как такая вещь выглядела бы, если бы Foo.pm был объектно-ориентированным:
package Local::Patched::Foo;
use parent 'Foo';
sub qux { print 2; }
1;
Теперь это, очевидно, не будет работать в нашем текущем случае, так как parent.pm просто не делает этоговещь.
Существует ли простой и понятный способ записи Local / Patched / Foo.pm (с использованием любых применимых модулей CPAN) таким образом, чтобы это работало, если не считать копирования пространства имен функции Foo.pm вручную?