La escritura de los métodos get/set es monótona y pesada. Si el objeto tiene 20 atributos habrá que escribir un buen número de métodos.
Podemos usar AUTOLOAD para que, cada vez que se llama a un método de acceso se instale en la tabla de símbolos. Para ello usaremos un ''typeglob'' y una subrutina anónima.
Sigue el código:
1 sub AUTOLOAD {
2 no strict "refs";
3
4 my $self = shift;
5 if ($AUTOLOAD =~ /\w+::\w+::get(_.*)/) {
6 my $n = $1;
7 die "Error in $AUTOLOAD: Illegal attribute\n" unless exists $self->{$n};
8
9 # Declarar el metodo get_*****
10 *{$AUTOLOAD} = sub { return $_[0]->{$n}; };
11
12 return $self->{$n};
13 } elsif ($AUTOLOAD =~ /\w+::\w+::set(_.*)/) {
14 my $n = $1;
15 die "Error in $AUTOLOAD: Illegal attribute\n" unless exists $self->{$n};
16 $self->{$n} = shift;
17
18 # Declarar el metodo set_*****
19 *{$AUTOLOAD} = sub { $_[0]->{$n} = $_[1]; };
20 } else {
21 die "Error: Function $AUTOLOAD not found\n";
22 }
23 }
En la línea 5 obtenemos el nombre del atributo y lo guardamos (línea 6)
en $n. En la línea 7 comprobamos que tal atributo existe.
La subrutina anónima que crea AUTOLOAD
en la línea 10 es una clausura con respecto a $n:
el valor se recuerda, incluso después que se haya
salido del ámbito.
Casiano Rodríguez León
