Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Динамическая подгрузка библиотек.


Автор: GoDleSS 7.8.2008, 12:41
Добрый день, уважаемый форумчане!

Решил заняться переработкой своей в общем-то отставшей от жизни CMS-ки.
В первую очередь занимаюсь универсализацией и методами повышения удобства создание модулей под нее(на данном этапе нельзя назвать полноценно модульной, но к тому стремлю).

В данный момент поднимаю задачу следующего характера:
 Есть некий набор входящих в дистрибутив библиотек. Часть грузится уже в index.cgi и необходимы для работы системы в целом. Но большинство нужны не всегда и не везде, посему грузить их сразу нет смысла.
 Хотелось бы, чтобы при вызове модулем метода new какого-то пакета эта либа динамически подгружалась.
Сейчас проблема решена заменой вызова конструктора на метод-прослойку.

Т.е. в упрощенном примере:
Код

package constructor;
...
sub create_object {
  my $self = shift;
  my $lib = shift;

  ...

  eval {
    require $lib_checked;
  };
  if ($@) {
    ...
    return 0;
  }

  $self->objects->{$lib} = $lib->new(@_);

  ...

  return $self->objects->{$lib};
}

...

my $formatter = $constructor->create_object('text::formatter', @options);



Но подобный подход себя не слишком оправдывает по нескольким причинам:
  Имя пакета должно строго совпадать с положением библиотеки(хотя это можно решить, читай из либы имя пакета и чуть доточив напильником.
  Модуль, содержащий несколько пакетов, уже будет сложнее использовать.
  Сам вызов не смотрится.
  ...еще много можно нафлудить...

Зачем я сие делаю? Уменьшаю по возможности объем кода теоретических будущих модулей ЦМСки, даю дополнительный потенциал логеру, стараюсь более точно динамически отслеживать работу модулей. Ну и просто интересно smile

Есть ли у кого идеи или наброски по более красивым решениям задачи?

Автор: ginnie 7.8.2008, 13:07
Уважаемый GoDleSS, как вариант, можно посмотреть http://search.cpan.org/~adamk/Class-Autouse/lib/Class/Autouse.pm.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)