Tiene razón, la documentación no es muy clara en esta área, especialmente porque los atributos no son tan complicados.Si define un atributo subrutina, así:
sub some_method :Foo { }
Perl al compilar su programa (esto es importante) buscar la sub magia MODIFY_CODE_ATTRIBUTES
en el paquete actual o cualquiera de sus clases padre. Se llamará con el nombre del paquete actual, una referencia a su subrutina y una lista de los atributos definidos para esta subrutina. Si este controlador no existe, la compilación fallará.
Lo que haga en este controlador es totalmente de usted. Si, eso es correcto Sin magia oculta en absoluto. Si desea señalar un error, devolver el nombre de los atributos ofensivos hará que la compilación falle con un mensaje de "atributo no válido".
Hay otro controlador denominado FETCH_CODE_ATTRIBUTES
que será llamado cada vez que alguien dice
use attributes;
my @attrs = attributes::get(\&some_method);
Este manejador se pasa el nombre del paquete y la subrutina de referencia, y se supone que devolver una lista de los atributos de la subrutina (aunque lo que realmente lo es de nuevo depende de usted).
Aquí se muestra un ejemplo para permitir simple "etiquetado" de los métodos con los atributos arbitrarios, que se puede consultar más adelante:
package MyClass;
use Scalar::Util qw(refaddr);
my %attrs; # package variable to store attribute lists by coderef address
sub MODIFY_CODE_ATTRIBUTES {
my ($package, $subref, @attrs) = @_;
$attrs{ refaddr $subref } = \@attrs;
return;
}
sub FETCH_CODE_ATTRIBUTES {
my ($package, $subref) = @_;
my $attrs = $attrs{ refaddr $subref };
return @$attrs;
}
1;
Ahora, en MiClase y todas sus subclases, puede utilizar atributos arbitrarios, y la consulta utilizando attributes::get()
:
package SomeClass;
use base 'MyClass';
use attributes;
# set attributes
sub hello :Foo :Bar { }
# query attributes
print "hello() in SomeClass has attributes: ",
join ', ', attributes::get(SomeClass->can('hello'));
1;
__END__
hello() in SomeClass has attributes: Foo, Bar
en resumen, los atributos no hacen mucho, que por el contrario los hace muy flexible: puede usar como reales "atributos" (como se muestra en este ejemplo), poner en práctica algo como decoradores (ver Sinan's answer), o para sus propios propósitos tortuosos.
¡Excelente respuesta! :RE – gideon