Newsgroup: it.comp.lang.perl
Titolo: Programmazione ad oggetti

Salve,
poiche` devo dare una rinfrescata al mio fetchmail dei poveri (fatto
in perl), ho deciso di provare a realizzare una serie di classi per
fare cio` che mi serve.
Avevo pensato di fare una prima classe che stabilisce la connessione
con il server di posta (pop3 o imap, anche via ssl) e mette a
disposizione una serie di metodi di base. Successivamente realizzare
delle altre classi per gestire i vari protocolli di cui ho bisogno,
che erediterebbero metodi e proprieta` dalla prima.
Tuttavia qualcosa non va a buon fine, altrimenti non sarei qui. :-)
Dopo tante parole, forse e' meglio che mi metta a scrivere un po' di
codice:
-*- Perl -*-
#!/usr/bin/perl -w
use strict;
{
    package Netlink;
 
    sub new
    {
	my ($that, $arg_hash) = @_;
	my $class = ref($that) || $that;
	my $self;
# $arg_hash e' composto da: Peer (Indirizzo del server), Proto (tipo
# protocollo di livello "applicazione"), UseSSL (valore booleano; 
# 0 ==  NO,  1 == YES)
	if ( $arg_hash->{'UseSSL'} )
	{
	    use IO::Socket::SSL;
	    $self = IO::Socket::SSL->new(PeerAddr => $arg_hash->{'Peer'},
					 PeerPort => $arg_hash->{'Proto'},
					 Proto    => 'tcp',
					 ) or die 'Unable to create socket';
	} else {
	    use IO::Socket::INET;
	    $self = IO::Socket::INET->new(PeerAddr => $arg_hash->{'Peer'},
					  PeerPort => $arg_hash->{'Proto'},
					  Proto    => 'tcp',
					  ) or die 'Unable to create socket';
	}
	return bless($self, $class);
    }
# ... Altri metodi che non creano problemi ...
}
{
    package Pop3;
    my @ISA = qw(Netlink);
# ... Metodi per implementare un sottoinsieme dei comandi pop3 che mi
# servono ...
}
-*- End -*-    
Il mio problema (credo di avere problemi, *grossi*, con
l'ereditarieta` della classe) e' che quando vado a creare un'istanza
della classe Pop3 ottengo l'errore:
Can't locate object method "new" via package "Pop3" at 
mailget.pl
 line
140.
Istanzio, anzi, provo ad istanziare Pop3 con l'istruzione:
my $try = Netlink->new({                 # Linea 140
    Peer =>'
relay.poste.it
', 
    Proto => 'pop3s', 
    UseSSL => 1
    });
Tuttavia, provando ad instanziare direttamente la classe Netlink,
tutto va a buon fine e riesco a stabilire la connessione con il
server.
Qualcuno puo` illuminarmi?
Ciao,
nico

  >>>>> "DDS" == Domenico Delle Side <nic...@Tiscali.IT> writes:
[...]
  DDS> my $try = Netlink->new({         # Linea 140 
                 ^^^^^^^
  Ho sbagliato a copiare, qui ci va Pop3.
Ciao,
nico

     my @ISA = qw(Netlink);
qui sta il tuo problema: non devi creare una variabile lessicale con my!
Perl usa @Pop3::ISA (cioè una variabile package) per il meccanismo
dell'ereditarietà. la variabile che tu dichiari con my non è @Pop3::ISA, ma
un @ISA lessicale allo scope del tuo package, che è cosa ben diversa.
la soluzione è fare invece:
    package Pop3;
    use vars qw(@ISA);
    @ISA = qw(Netlink);
per un (ottimo) approfondimento su variabili lessicali e package, puoi
leggere l'articolo di Mark Jason-Dominus tradotto in italiano da (l'ottimo)
Stefano Rodighiero a quest'indirizzo:
http://www.perl.it/documenti/articoli/namespaces/index.html
cheers,
Aldo
--- have fun with 
www.perl.it
 ---

 writes:
[...]
  AC> la soluzione è fare invece:
  AC> package Pop3; 
  AC> use vars qw(@ISA); 
  AC> @ISA = qw(Netlink);
Funziona alla grande. :-)
Mi aveva tratto in inganno il fatto che il tutorial (quello degli
animali, perlboot) che ho letto non usasse strict e quindi non si
ponesse il problema dello scope. Ovviamente ci ho messo anche del mio,
dimenticandomi generosamente di questo aspetto.
  AC> per un (ottimo) approfondimento su variabili lessicali e
  AC> package, puoi leggere l'articolo di Mark Jason-Dominus tradotto
  AC> in italiano da (l'ottimo) Stefano Rodighiero a quest'indirizzo:
  AC> 
http://www.perl.it/documenti/articoli/namespaces/index.html
Non manchero` di leggerlo.
Grazie mille,
nico