Como posso obter Perl para dar uma mensagem de aviso quando um pacote certo / tag é importado?
Pergunta
Eu tenho um pacote que acabou de fazer e eu tenho um "velho modo" que, basicamente, faz com que funcione como funcionou antes: importar tudo no namespace atual. Uma das coisas agradáveis ??sobre ter isso como um pacote é que não temos mais de fazer isso. Enfim, o que eu gostaria de fazer é tê-lo de modo que sempre que alguém faz:
use Foo qw(:oldmode);
Eu lanço um aviso de que este é obsoleto e que eles devem quer importar apenas o que eles precisam ou funções de acesso apenas com foo-> fun ();
Algumas ideias sobre como fazer isso?
Solução
Bem, como você especificamente estado que pretende alarme nos casos de use Mod qw<:oldmode>;
Isso funciona melhor:
package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import {
#if ( grep { $_ eq ':oldmode' } @_ ) { # Perl 5.8
if ( @_ ~~ ':oldmode' ) { # Perl 5.10
carp( 'import called with :oldmode!' );
}
goto &{Exporter->can( 'import' )};
}
Graças a Frew, para mencionar o inteligente sintaxe jogo Perl 5.10. Estou aprendendo todas as formas de trabalho Perl 5.10 em meu código.
Nota: a maneira padrão de uso exportador em uma sub importação, quer seja para manipular $Exporter::ExportLevel
ou para Foo->export_to_level( 1, @_ );
chamada Mas eu gosto da maneira acima. É mais rápido e, penso eu, mais simples.
Outras dicas
Você escreve seu próprio sub import
em package Foo
que será chamada com a lista de parâmetros de use Foo
.
Um exemplo:
package Foo;
use Exporter;
sub import {
warn "called with paramters '@_'";
# do the real import work
goto &{Exporter->can('import')};
}
Assim, em sub import
você pode pesquisar a lista de argumentos para o tag obsoleta, e depois jogar um aviso.
Atualização : Como Axeman aponta, você deve chamar goto &{Exporter->can('import')}
. Esta forma de Goto substitui a chamada sub-rotina corrente na pilha, preservando os argumentos atuais (se houver). Isso é necessário porque a importação do Exportador () método irá exportar para namespace do seu chamador.