Miguel,
La forma más fácil de implementar un proxy es que la clase proxy implemente el mensaje doesNotUndestood como unico mensaje, en verdad, un proxy es un objeto que tiene basicamente
dos características, 1) que no tenga protocolo que no entienda ningún mensaje, 2) que tenga una manera de hacerle llegar los mensajes al objeto proxiado.
Para cumplir con la primera premisa, Pharo, tiene ProtoObject , un root de classes que no cuelga de Object, porque de alguna manera Object sabe muchas cosas, y un proxy no debería,
Dado que en Smalltalk los Proxys son objects, esto nos lleva a la segunda premisa,hacerle llegar el mensaje o delegar en el objeto proxiado,alli la estrategia cambia, o podria ser mas compleja la relación entre el proxy y su objecto proxiado.
Aqui la forma mas sencilla es que Proxy tenga el mensaje doesNotUnderstood: aMessage, está
estrategia, está basada en algo llamado method lookup, que es como Smalltalk resuelve un mensaje,
Un objeto recibe un mensaje, se fija si en su clase lo puede contestar (si lo tiene implementado) sino delega a su super clase y sin no lo puede responder llegará a subiendo por la jerarquia a Object, object genera una excepcion y le envia al receptor original del mensaje doesNotUnderstood: aMessage.
Entonces si implementas este mensaje podras enviarle cualquie mensaje a dicho objeto , en el colaborador aMessage están todos los objetos necesarios para resolver el mensaje (receptor colaboradores enviados como "parametros" etc).
Resumiendo el proxy es un objeto que proxea a otro. por ejemplo podrias tener
proxy := Proxy for: onObjectToProxy.
ahora esto indica que el objeto a proxiar queda contenido en el proxy, de manera que el objeto proxy es el receptor de cualquier futuro mensaje. que puede ser cualquiera, entonces poniendole el mensaje doesNotUnderstood interceptas el mensaje y como resuelvas luego es cuestion de tu dominio.
Espero haberte sido útil ,cualquier otra cosa, pregunta.
saludos
Juan Diaz Cortez