В SQL 2005:
select object_name(object_id), name
from sys.columns
where is_identity = 1
Самое простое решение - указать 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
для управления стеком вызовов.
Я новичок в Moose, но почему вы делаете это:
use Moose::Util;
Moose::Util::apply_all_roles(__PACKAGE__->meta, ('App:Roles::CustomRole'));
, а не просто это?
with 'App:Roles::CustomRole';
Что касается вашего вопроса, это немного похоже на взлом, но не могли бы вы разделите свой метод вокруг
на до
и после
методов и примените роль в конце определения класса (чтобы она применялась в желаемом порядке)? Вы можете использовать частные атрибуты для сохранения состояния между двумя методами, если это абсолютно необходимо.