Uso de AUTOLOAD para la Generación de Accesors/Mutators

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19