У меня есть модуль, который определяет исключения для пакета, частью которого он является.Исключения объявляются с помощью Exception::Class::Nested
.
. В целях обсуждения предположим, что этот модуль называется Foo::Bar::Exception
, и что все определяемые им исключения являются подклассами первого уровня этого ( например , Foo::Bar::Exception:DoNotDoThat
).Все исключения, которые меня волнуют, определены в этом файле модуля;Я не заинтересован в каких-либо дополнительных подклассах, которые любой другой модуль делает со мной.
Для моего import
метода я хочу составить список всех определяемых исключений, и я хотел бы сделать этообходя таблицу символов каким-либо образом, а не сохраняя жестко закодированный список, который может быть не синхронизирован с определениями и должен поддерживаться вручную.
Итак, как Foo::Bar::Exception->import
может перебирать Foo::Bar::Exception
таблица символов, чтобы найти все исключения (подклассы первого уровня), которые были объявлены в модуле?Меня интересует только активная загруженная таблица символов;поиск файловой системы или тому подобное.
Спасибо!
[ addendum ]
Поскольку все имена подклассов моих исключений заканчиваются на Exception
или Error
, похоже, это приближается к тому, что я хочу:
my %symtable = eval("'%' . __PACKAGE__ . '::'");
my @shortnames = grep(m!(?:Error|Exception)::$!, keys(%symtable));
@shortnames = ( map { $_ =~ s/::$//; $_; } @shortnames );
my @longnames = ( map { __PACKAGE__ . '::' . $_ } @shortnames );
Некоторые скобки не нужны, но я добавил их для ясности относительно контекста массива.