Вперед: Условные операторы
Вверх: Приложение А. Синтаксис внутреннего
Назад: Работа с переменными из
  Содержание
Динамический модуль является методом класса modules.pm. Атрибуты
модуля перечисляются после его открытия.
Синтаксис такой:
# имя_атрибута значение1, значение2, ..., значениеn
Если атрибут является аддитивным, его имя может быть повторено
несколько раз, если нет -- в качестве значения атрибута берется
последнее его вхождение.
В атрибуте child перечисляются все безусловно вызываемые модули, в
child-if -- которые могут быть вызваны, child-for -- которые вызываются в
цикле, при этом последнее значение -- комментарий.
Атрибут comment (аддитивный) содержит строку, которая описывает
функциональность модуля.
Атрибут slot описывает слоты, используемые в данном модуле. последнее
значение -- строка-комментарий к слотам.
Атрибут tag описывает вспомогательный HTML-фрагмент, который
присваивается аргументу. Первое значение -- имя тэга, второе -- номер
аргумента, которому он присваивается (см. далее пример для if ).
Результатом работы динамического модуля должен быть HTML-фрагмент.
Стандартными методами являются slot и var . Аргументам является имя
переменной. Для var можно указать два аргумента, тогда оператор
выполняет присваивание переменной значения второго аргумента.
Если указать атрибут manual , система не будет вычислять слоты (и
аргументы) модуля (тем не менее, компилятор подготовит псевдокод,
который их вычисляет). Тогда сам модуль может определить, какие слоты
следует вычислять, а какие -- нет. Вычисление слота осуществляется
автоматически оператором slot (разумеется, только один раз).
Упорядоченные аргументы должны в этом случае считываться как слоты. Во
всех остальных случаях упорядоченные аргументы передаются как
упорядоченные фактические параметры в вызове функции.
Для того чтобы вызвать модуль, нужно создать объект класса module . В
конструкторе указывается имя модуля.
Метод view класса module вызывает этот модуль. Если первый аргумент --
хеш, в нем содержатся пары слот-значение, остальные аргументы являются
порядковыми аргументами модуля.
Пример:
sub internet_contents {
# comment Содержание электронного журнала "Интернет"
# slot id "Номер выпуска"
# child-for internet-contents-article "Элемент содержания
my $self=shift;
my $db=$self->getdb();
my $id=$self->slot('id');
my $result='';
my $cursor=$db->prepare("select title, summary, author
from article where number=$id");
my $t = new module('internet-contents-article');
while (my $h=$cursor->fetchrow_hashref()) {
$result.=$t->view($h);
}
$cursor->fninish();
return $result;
}
|