Siguiendo con la idea de los interceptores y esta pseudo AOP, finalmente pude subir el código a GitHub.
Claramente faltan algunas cosas (Minimizar por ejemplo), pero espero ir evolucionándolo.
En cualquier caso, pueden verlo aquí: https://github.com/MatiasIac/ToolPack
Como mostraba en el post anterior, algunos puntos a destacar eran la detección de dónde inyectar el código y cómo reconocerlo desde el mismo JavaScript sin tener que usar un meta lenguaje o algo que corra por fuera del mismo JavaScript.
s.prototype.sum = function (a, b, result, __interceptor) { console.log('Sum function called'); console.log(a + b); };
En este caso, cualquier variable que sea colocada en la firma de una función y que además inicie con __ sería tomada como el nombre del interceptor a ser ejecutado cuando esta función se llamase.
En la definición de los interceptores, entonces, tendríamos lo siguiente:
Interceptor.define('__interceptor')...
Definiendo el interceptor mediante su nombre y pudiendo agregar diferentes funciones anónimas, en cascada, que se ejecuten generando un resultado.
.having(function() { console.log('interceptor called'); console.log(this); return "hola"; }, { context: { ok: true }, injectResult: true })
Si bien en este ejemplo no se manejan las variables que se pasaron originalmente a la función que intentábamos llamar, las mismas pueden ser declaradas en la firma de la función anónima o tomarlas desde arguments.
Solo como para darle algo de sabor a todo esto, opté por dar la posibilidad de configurar cada interceptor mediante un objeto de configuración. En este caso sería posible pasarle un contexto particular al interceptor, el que pudiera ser accedido mediante this, y también permiter retornar sus resultados e inyectarlos dentro de la función que finalmente es llamda.
Volviendo al código inicial, la variable result contendrá todos estos valores.
s.prototype.sum = function(a, b, result, __interceptor)
Seguramente dedique otro post a describir internamente el interceptor… pero eso vendrá luego 🙂