[SP-pm] Sinal de metodo nao existente

Adriano Ferreira a.r.ferreira em gmail.com
Sábado Abril 26 14:36:10 PDT 2008


2008/4/25 Lucas Mateus <lucasmateus.oliveira at gmail.com>:
> use Net::FTP;
>
> BEGIN {
>     $SIG{__DIE__} = 'IGNORE'
> }
>
> my $ftp = Net::FTP->new();
>
> $ftp->abcd;
>
> print "TESTE\n";
> exit(1);
>
>
> Alguem sabe dizer se esse erro emite sinal ?

Eu acabei de lembrar de um 'hack' horrível para fazer com que Net::FTP
ignore completamente a falta de um método chamado sobre suas
instâncias, como é o caso do "$ftp->abcd" no seu exemplo.

Isto pode ser feito através do Class::BlackHole
(http://search.cpan.org/perldoc?Class::BlackHole).

Abaixo está um ligeira modificação do seu exemplo. Ao invés de setar
em um BEGIN, o $SIG{__DIE__} para 'IGNORE' que não funciona, o
Class::BlackHole é carregado (via require) e adicionado ao final do
@ISA do Net::FTP. Daí em diante, qualquer chamada de método
inexistente em instâncias de Net::FTP será complacente e não fará
absolutamente nada (inclusive não morrerá com "Can't locate object
method "abcd" via package "Net::FTP"").

Foi necessário transformar o

     Net::FTP->new()

para

     Net::FTP->new( $host )

pois do contrário o construtor do Net::FTP retorna 'undef' por não
achar um servidor ftp válido. (Sobre "undef", método nenhum pode ser
chamado.)

Experimente este código em um arquivo "lucas.pl"

$ perl lucas.pl ; echo $?
TESTE
1


#############

# lucas.pl
use Net::FTP;

#BEGIN {
#    $SIG{__DIE__} = 'IGNORE'
#  }

BEGIN {
  require Class::BlackHole;
    push @Net::FTP::ISA, qw( Class::BlackHole )
}

my $ftp = Net::FTP->new( 'cpan.hexten.net' );

$ftp->abcd;

print "TESTE\n";
exit(1);

#############

> _______________________________________________
>  SaoPaulo-pm mailing list
>  SaoPaulo-pm at pm.org
>  http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


Mais detalhes sobre a lista de discussão SaoPaulo-pm