[Madrid-pm] Una pregunta tonta

Victor Moral victor en taquiones.net
Mie Abr 18 12:50:52 PDT 2007


El Miércoles, 18 de Abril de 2007 13:22, DervishD escribió:
>  * DervishD <bugs en dervishd.net> dixit:
> >     Por otro lado, tengo una pregunta tonta: ¿cómo hago para que un
> > método sea "interno" (privado) a un package? Sé cómo hacerlo en C pero
> > en Perl no tengo ni idea, y he visto de todo, desde lo de los paquetes
> > "Heavy" hasta "::private", pero ninguna de esas soluciones impide que el
> > llamante acabe usando "Class::private->metodo_que_no_deberia_usar".
>
>     Se me ocurre implementar los objetos como closures y dentro del
> closure comprobar que la subrutina está siendo llamada desde su propio
> package, pero entonces se plantean los siguientes problemas:

	Un momento que me pierdo, ¿ un método privado es aquél que sólo puede 
llamarse desde el propio paquete ? Es decir, que existe en el código desde el 
principio pero que cualquier llamada desde el exterior resulta en ... ¿ 
qué  ? ¿ una excepción ? 

	Pues si es eso, la solución más simple a mi entender es usar caller para 
determinar de dónde nos viene la llamada en tiempo de ejecución:

	sub _privado_total {
		my $package = (caller)[0];
		if ($package ne __PACKAGE__) {
			die "kabooom";
		}

	}

>     - Las clases derivadas no pueden usar el closure (bueno sí, si el
> closure usa "isa" para comprobar el package del llamante, o algo así).
>
>     - Esto en realidad sólo sirve para métodos que accedan a los datos
> del objeto. Para métodos generales habría que hacer un closure dentro
> del closure que es el objeto o algo así de complicado.
>
>     - ¿Y el GC? La verdad es que nunca se me había ocurrido todo esto y
> no sé cómo destruir el closure. ¿Serviría algo tan simple como asignar
> "undef" al escalar que contiene la referéncia del closure?

	Es que ocultarlo como bien te han dicho no es posible, salvo que lo 
construyas en tiempo de ejecución y lo ocultes, pero vamos, que en C es más 
fácil porque si no recuerdo mal una función privada (static) no aparece en 
los símbolos para el enlazador ¿ no ? Vamos, que ni se menciona y a menos que 
le pases una referencia a ella no tiene acceso desde fuera (desbordamientos 
de pila aparte ;-) ).

	En Perl no tienes más opción que confiar en el grado de civismo de los 
usuarios y, como te han dicho (y ojo que sirve también para las clases) basta 
con prefijarlas con un subrayado.

>     En fin, que esta vez es definitivo, dejo el LSD porque noto que no
> me hace ningún bien XDDD

	Pues sí, no hay nada como el orujo para las digestiones :-)

Saludos 
-- 
 --------
 Víctor Moral <victor en taquiones.net>
 http://taquiones.net/victor.html
 Usuario Linux nº 139246

------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : no disponible
Tipo       : application/pgp-signature
Tamaño     : 189 bytes
Descripción: no disponible
Url        : http://mail.pm.org/pipermail/madrid-pm/attachments/20070418/146bdb35/attachment.bin 


Más información sobre la lista de distribución Madrid-pm