Модификаторы Метода Американского лося Perl: Звоните 'вокруг' прежде чем 'прежде' и 'после'

В SQL 2005:

select object_name(object_id), name
from sys.columns
where is_identity = 1
5
задан Matt Wood 9 November 2009 в 17:32
поделиться

2 ответа

Самое простое решение - указать CUSTOM ROLE метод, который вызывает основной метод, а затем заключить его в оболочку.

role MyRole { 
    required 'wrapped_method';
    method custom_role_base_wrapper { $self->wrapped_method(@_) }

    around custom_role_base_wrapper { ... }
    before custom_role_base_wrapper { ... }
}

Проблема в том, что вы пытаетесь получить CUSTOM ROLE оберните что-нибудь другое , кроме метода. Это не то, для чего он предназначен. Помимо написания подобного хакерства с таблицей символов, как вы предложили (возможно, вы могли бы убедить одного из людей Moose в предоставлении API в Class :: MOP, чтобы помочь туда), единственное другое решение, о котором я могу думать, - это то, что указано выше.

Если вам не нужен дополнительный кадр стека вызовов, который добавит custom_role_base_wrapper , вам следует посмотреть на Yuval Sub :: Call :: Tail или использовать goto для управления стеком вызовов.

5
ответ дан 14 December 2019 в 04:41
поделиться

Я новичок в Moose, но почему вы делаете это:

use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));

, а не просто это?

with 'App:Roles::CustomRole';

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

3
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: