Ya sé cómo pasarle argumentos a init()...
Si miramos el código fuente del módulo, tenemos esto:
Using perl Syntax Highlighting
sub new {
my $self = shift;
my $p = bless({},$self);
# set default values
$p->name('myrss');
$p->cacheDir('.');
$p->feedDir('.');
$p->minInterval(300); # in seconds
$p->maxItemCount(30);
$p->passthru({});
$p->updateStatus('update not executed yet');
# initialize properties (for sub-classes)
$p->init(@_);
return $p;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Es el método que se encarga de crear el objeto XML::RSS::FromHTML. Y observa la línea 41: es ahí donde se llama al método init(). Y lo que más nos interesa: le está pasando como argumento el valor de @_, que está almacenando todos los argumentos que le hubiéramos pasado a new().
Es decir: todos los argumentos que le pasamos al método new() son pasados al método init(). Por lo tanto, podrías escribir la parte del programa algo así:
Using perl Syntax Highlighting
for my $pagina (@paginas) { # @paginas contiene toda la información de todos los enlaces a analizar
my $rss = Modulo->new($pagina->{nombre}, $pagina->{enlace});
$rss->update;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y en el Modulo, modificar el init() para que sea algo así:
Using perl Syntax Highlighting
sub init {
my $self = shift;
# configuración
$self->name($_[0]);
$self->url ($_[1]);
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De esta manera, ya le pasamos el nombre y la URL al módulo.
Pero... tenemos ahora otro problema... y es el método defineRSS(). A este método también le tenemos que personalizar para que podamos definir el título y descripción de todo el canal RSS. Y aquí tropezamos: no hay forma sencilla de pasarle los argumentos.
Entonces... se me ha ocurrido que podemos hacer algo 'alegal', consistente en 'ampliar' los atributos del objeto XML::RSS::FromHTML, incorporando el título y la descripción del canal.
Entonces, cambiamos una vez más la llamada a new() para que tengo dos argumentos más:
Using perl Syntax Highlighting
my $rss = Modulo->new(
$pagina->{nombre},
$pagina->{enlace},
$pagina->{titulo},
$pagina->{descripcion},
);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De esta manera, pasamos a init() todos los valores. Ahora modificamos init() dentro de Modulo:
Using perl Syntax Highlighting
sub init {
my $self = shift;
# configuración
$self->name($_[0]);
$self->url ($_[1]);
$self->{titulo} = $_[2];
$self->{descripcion} = $_[3];
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con esto, estamos creando dos nuevos atributos del objeto, e inicializándolos con los valores del canal RSS. Ahora solo queda modificar
Using perl Syntax Highlighting
sub defineRSS {
my $self = shift;
my $xmlrss = shift;
# definiciones del RSS generado
$xmlrss->channel(
title => $self->{titulo},
description => $self->{descripcion},
);
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya está: las definiciones del canal RSS las obtenemos de los atributos del objeto que guardamos antes en init().
Esto es algo 'alegal'
porque no es recomendable crear/acceder a los atributos de un objeto, de esta forma tan directa.
Pero bueno... Perl es lo suficientemente flexible como para permitir hacer estas piruetas.