Могу ли я заказать модификаторы метода заказа, загруженные как часть признаков? - PullRequest
2 голосов
/ 15 августа 2010

Это продолжение до предыдущего вопроса . если у меня есть несколько плагинов / черт с модификаторами around, возможно ли обеспечить определенный порядок выполнения (видя, как я не могу быть уверен, какой из них действительно будет загружен)? или я действительно могу контролировать только то, что в коде, который я пишу, и с документацией?

Пример: у меня есть 3 роли, каждая из которых имеет around, и каждая из них может быть дополнительно загружена как Черта , но если загружено более 1, они должны быть загружены в определенном порядке, чтобы работать вместе , например загрузка Trait A B C в таком порядке с нормальной работой, но загрузка его, как Trait B A C, приведет к странному поведению.

Есть ли способ, которым я могу запретить пользователю (программисту) загружать их в неправильном порядке.

Ответы [ 3 ]

1 голос
/ 15 августа 2010

Можно ли как-то помешать пользователю (программисту) загружать их в неправильном порядке.

Это очень субъективный ответ и зависит от архитектуры вашей системы,который вы не описали.Но один из способов заключается в том, что вы можете применять роли «себя» в другой роли, которая затем применяется исключительно к классу:

package OmniRole;
use Moose::Role;

with 'RoleA',' RoleB', 'RoleC';  # these roles contain the 'around' method modifier


package User::Class;
use Moose;

with 'OmniRole';    # wraps method 'foo' several times to do magic.
1 голос
/ 19 августа 2010

Краткий ответ - «Нет».В то время как модификаторы методов упорядочены, Роли естественным образом составляются неупорядоченными.Этот конфликт композиции является одной из причин, по которым модификаторы методов в ролях чреваты опасностью, и вы редко видите, как они используются для чего-то сложного в дикой природе.

Пользователи также особенно известны за неупорядоченность.Moose предоставляет несколько инструментов для обеспечения упорядоченного состава ролей (по замыслу).В пользовательском пространстве нет ничего, что могло бы их сдерживать.

Тем не менее, вы можете использовать предложение Эфира в другом ответе, создавая мета-черту, которая состоит из черт, составленных в правильном порядке.В качестве альтернативы вы можете спрыгнуть с глубокого конца и переписать фрагменты Role Composition Moose, чтобы гарантировать упорядоченную композицию.Я, честно говоря, не могу порекомендовать ни один из этих подходов, оба, кажется, намазаны тем, что для меня было бы явным признаком плохого дизайна.

Не зная больше о вашей конкретной проблеме, я не могу предложить лучшего решения.В общем, я хотел бы искать что-то вроде регистрации обратного вызова и его запуска, а не полагаться на модификаторы методов.

1 голос
/ 15 августа 2010

Цитировать Moose :: Manual :: MethodModifiers (прямо перед ПОЧЕМУ ИХ ИСПОЛЬЗОВАТЬ?).

Когда есть несколько модификаторов одного типа, до и околомодификаторы запускаются от последнего добавленного к первому, и после того, как модификаторы запускаются от первого добавленного к последнему:

до 2
до 1
около 2
около 1
первичное
около 1
около 2
после 1
после 2

Идея состоит в том, что вы модифицируете метод , поскольку он существует прямо в этот момент .

...