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