| Basicos::Base::Private - Añade datos privados a una clase |
Basicos::Base::Private - Añade datos privados a una clase
package MyPackage;
use base qw(Basicos::Base::Private);
MyPackage->_private_data(
path => '/tmp',
modules => { },
fh => undef
);
sub method1 {
my $self = shift;
my $data = $self->_private();
$data->{path} = '/var/tmp';
};
Esta clase está diseñada para proporcionar un juego de variables (datos) privados a una clase de manera casi automática.
No se crean métodos ni nada similar, tan sólo una estructura de datos a la que puede accederse de una manera sencilla y cómoda.
La forma de uso es la siguiente:
Una directiva como use base qw(Basicos::Base::Private) basta para ello. Por
supuesto se puede derivar de otras también, basta con añadírselas en la misma
línea ó usar otra línea más.
Mediante una llamada a _private_data se le pasa un hash que quedará copiado
en una tabla interna del módulo. La copia es recursiva, por lo que pueden
especificarse varios niveles de anidación.
En cada uno de los métodos (por ejemplo) en los que se desee hacer uso de
estos datos conviene llamar a _private para obtener una referencia de
acceso a este hash, y asegurarse de paso de que el objeto está correctamente
inicializado.
MyPackage->_private_data( %data )
Este método de clase define un hash de datos privados asociado al nombre de la clase, asumiendo que la clase sea del tipo hash, porque cualquier otra (como a un array ó a un escalar) no funcionaría.
La idea es definir una clave en el objeto que apunte a una copia de la estructura. La clave se forma con el nombre de la clase en minúsculas, los caracteres de separación convertidos a subrayados y prefijados con otro.
Por ejemplo Basicos::Base::Private quedaría como _basicos__base__private, que suponemos una buena clave única para el objeto.
sub mymethod1 {
my $self = shift;
my $data = $self->_private();
...
}
Este método recibe una referencia a un objeto, se asegura de tener la estructura privada inicializada y retorna una referencia a ella.
El objeto, en el caso del ejemplo de la sinopsis, quedaría de la siguiente forma:
$self = {
.... # otros atributos
'_mypackage' => {
path => '/tmp',
modules => { },
fh => undef
},
};
No se necesario guardar el valor de retorno, éste sólo es necesario para no tener que recordar cuál es la raíz de dicha estructura.
my $root_name = MyPackage->_private_root();
my $root_name = $self->_private_root();
Este método obtiene la clave bajo la cuál se almacenan en el objeto los datos privados.
Puede ser llamado tanto con una clase como con un objeto.
my $object = MyPackage->new();
Esta clase sobrecarga el método de creación de objetos para asegurarse de que, recién creados, ya disponen de los datos privados. Útil en casos muy concretos, pero dado que el método deriva a las clases base es posible incluirlo sin problemas en una cadena de herencia.
Obviamente, sólo inicializa los datos tras crear el objeto en una clase derivada con éxito.
El módulo no genera ningún tipo de error.
There are no known bugs in this module. Please report problems to the author(s). Patches are welcome.
Víctor Moral <victor@taquiones.net>, Angel Ortega <angel@triptico.com>
Copyright (c) 2005 <Venexma Europa, S.L.>. All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
| Basicos::Base::Private - Añade datos privados a una clase |