Если конфликт имен вызван импортом из другого модуля, вы можете рассмотреть либо Sub::Import
, что позволяет легко переименовать импорт, даже если экспортирующий модуль явно не поддерживает это, либо namespace::autoclean
/ namespace::clean
.
package YourPackage;
use Sub::Import 'Some::Module' => (
foo => { -as => 'moo' },
); # imports foo as moo
sub foo { # your own foo()
return moo() * 2; # call Some::Module::foo() as moo()
}
Модули очистки пространства имен будут полезны, только если импорт затеняет любой из ваших методов с помощью функции, а не в любом другом случае:
package YourPackage;
use Some::Module; # imports foo
use Method::Signatures::Simple
use namespace::autoclean; # or use namespace::clean -except => 'meta';
method foo {
return foo() * 2; # call imported thing as a function
}
method bar {
return $self->foo; # call own foo() as a method
}
1;
Таким образом, импортированная функция будет удалена после компиляции вашего модуля, когда вызовы функции foo () уже связаны с импортом. Позже, во время выполнения ваших модулей, вместо этого будет установлен метод foo
. Разрешение метода всегда происходит во время выполнения, поэтому любые вызовы методов -> foo будут разрешены для вашего собственного метода.
Кроме того, вы всегда можете вызвать функцию по ее полному имени и не импортировать ее.
use Some::Module ();
Some::Module::foo();
Это также можно сделать для методов, полностью отключив поиск метода во время выполнения:
$obj->Some::Module::foo();
Однако необходимость делать это обычно является признаком плохого замысла, и вам, вероятно, следует отступить немного назад и объяснить, что вы сделали, чтобы вы попали в эту ситуацию.