Могу ли я обладать состоянием?

В примере, первые три строки в блоке класса:

        has      &!callback;
        has Task @!dependencies;
        has Bool $.done;

определяют атрибуты ( в других языках они могут называться полями или хранилищем экземпляра). Атрибуты действительно являются индивидуальным местом хранения данных для каждого созданного объекта. Так же как переменные созданные с помощью my не могут быть доступны извне области их видимости так и атрибуты объектов доступны только внутри класса. Данная особенность является основой объекто-ориентированного проектирования и называется инкапсуляцией.

Первая строка среди атрибутов определяет память для хранения callback -- небольшого куска кода. Он будет вызван для выполнения задачи, которую представляет экземпляр класса Task.

    has &!callback;

Сигил & указывает, что аттрибут представляет собой нечно вызываемое (invocable). Символ ! является твигилом (twigil), или выражаясь иначе - вторым сигилом. Твигил является частью имени переменной. В данном случае твигил ! подчеркивает что данный атрибут является приватным (собсвенным, private), то есть недоступен вне класса.

Определение второго атрибута класса Task также содержит приватный твигил:

    has Task @!dependencies;

Однако этот атрибут представляет собой массив элементов и поэтому необходим сигил @. Каждый из элементов представляет собой задачу, а все вместе очередность задач, которая является условием завершения текущей. Кроме того тип атрибута сообщает, что элементы массива могут быть только экземплярами класса Task ( или класса, производного от него ).

Третий атрибут хранит статус готовности задачи:

    has Bool $.done;

Этот скалярный атрибут ( сигил $ ) имеет тип Bool. Вместо твигила ! используется твигил .. В то время как инкапсуляция атрибутов является в Perl 6 полноценной, язык позволяет избавиться от необходимости явно создавать методы доступа к атрибутам из вне (accessor methods). Замена ! на . помимо определения атрибута $!done определит метод доступа done. То есть результат будет тот же, как если вы написали бы следующий код:

    has Bool $!done;
    method done() { return $!done }

Обратите внимание, что это отличается от определения публичного атрибута, как это позволяют некоторые языки: и вы действительно получаете недоступную снаружи переменную и метод, без необходимости писать этот метод вручную (просто заменив ! на .). Подобный способ хорош пока вам не понадобится более сложные действия, чем просто возврат значения.

Стоит заметить что твигил . создает метод с доступом к атрибуту только в режиме чтения. Чтобы пользователи этого объекта могли сбросить статус готовности задачи (для выполнения ее например повторно) можно изменить определение атрибута на следующее:

    has Bool $.done is rw;

traits, is rw

Свойство is rw приводит к генерации метода доступа c возможностью модифицировать значение атрибута.