Я работаю над пакетом, который определяет исключения (используя Exception::Class::Nested
) для своего «родительского» пакета. Я не хочу, чтобы родительский пакет использовал действительно длинные имена, хотя и Я не хочу загрязнять любое другое пространство имен.
Итак, я хотел бы экспортировать последний элемент имен классов в пространство имен пакета, use
d пакета исключений.
Например, выдержка из пакета исключений:
package Klass:Foo::Bar::Exceptions;
use vars qw( @ISA @EXPORT @EXPORT_OK ... );
@ISA = qw( Klass::Foo::Bar Exporter );
use Exception::Class::Nested 0.04 (
'Klass::Foo::Bar::Exceptions::BaseClass' => {
description => 'Base class for exceptions',
'Klass::Foo::Bar::Exceptions::NameError' => {
error => "I don't like your face"
}
}
);
Пакет 'parent':
package Klass::Foo::Bar;
use Klass::Foo::Bar::Exceptions;
Klass::Foo::Bar::Exceptions::NameError->throw(error => "D'oh!");
my $e = NameError->new(error => 'Mwahaha!');
Я бы хотел бы экспортировать / импортировать класс исключений так, чтобы второй вызов (my $e
один) работал так, как если бы NameError
был определен в Klass::Foo::Bar
, но я не разобрался пока.
(И прежде чем кто-нибудь скажет «но у Exception::Class
есть изящная alias
штука», я укажу, что псевдоним связан конкретно с методом throw
исключения, поэтому я не может использовать это для неавтоматических new
вызовов ..)
Одна вещь, которую я попробовал, это поместить ее в подпункт importer
пакета исключений (@snames
- это либо массив полностью определенных классов исключений ( например , 'Klass::Foo::Bar::Exceptions::NameError'
), либо просто хвостовой конец ( например , 'NameError'
):
my $caller = caller();
$caller ||= 'main';
my @snames = @{$EXPORT_TAGS{exceptions}};
for my $exc (@snames) {
$exc =~ s/^.*:://;
no strict qw(subs refs);
*{"${caller}\:\:${exc}\:\:"} = \*{__PACKAGE__ . "\:\:${exc}\:\:"};
}
Но это заканчивается тем, что я должен вызывать исключения, используя Klass::Foo::Bar::NameError
вместо NameError
. Кажется, это работает, но слишком хорошо.
Я не хочу импортировать NameError
в main::
!
Боюсь,
Типглобы и таблицы символов все еще немного загадочны.
Я уверен, что есть способ сделать то, что я хочу (иначе я делаю то, чего не должен делать вообще, но давайте пока оставим это в покое). Кто-нибудь может мне помочь с этим?
Спасибо!