Методы

В то время как атрибуты определяют состояние объекта, методы определяют его поведение. Пропустим временно специальный метод new и рассмотрим второй метод add-dependency, который добавляет новую задачу к списку зависимостей для текущей задачи.

    method add-dependency(Task $dependency) {
        push @!dependencies, $dependency;
    }

В большинстве случаев, определение метода похоже на определение sub. Однако имеется два важных отличия. Во первых, определение подпрограммы как метода добавляет ее к списку методов текущего класса. Благодаря этому у любого экземпляра класса Task можно вызвать необходимый метод с помощью оператора вызова .. Во вторых, метод сохраняет своего инвоканта в специальной переменной self.

Рассматриваемому метод передается один параметр, экземпляр класса Task, который затем добавляется к содержимом атрибута инвоканта @!dependencies.

Следующий метод содержит основную логику обработки зависимостей:

    method perform() {
        unless $!done {
            .perform() for @!dependencies;
            &!callback();
            $!done = True;
        }
    }

Он вызывается без параметров и использует атрибуты объекта. Сначала анализируется атрибут $!done, который является признаком выполненной задачи. Если этот атрибут содержит значение "истина", то задача выполнена и никаких действий не производится.

Иначе метод выполняет все зависимости для задачи, используя конструкцию for для поочередного обхода всех элементов в атрибуте @!dependencies. Этот цикл во время итерации размещает каждый элемент ( экземпляр класса Task ) в topic переменной $_. При использовании оператора вызова метода . без явного указания инвоканта используется текущая topic переменная. Таким образом производится вызов метода .perform() у каждого объекта Task, хранящихся в атрибуте @!dependencies текущего инвоканта.

После того, как все зависимые задачи завершены, наступает время выполнить текущую задачу Task. Это производится с помощью прямого вызова атрибута &!callback ( после атрибута указываются круглые скобки). В итоге атрибуту $!done присваивается значение True ("Истина") и это гарантирует, что при последующем вызове метода perform этого объекта никаких повторных действий производится не будет.