diff --git a/helma/Aspects.js b/helma/Aspects.js index c7045d65..ad2ad798 100644 --- a/helma/Aspects.js +++ b/helma/Aspects.js @@ -6,29 +6,36 @@ * compliance with the License. A copy of the License is available at * http://adele.helma.org/download/helma/license.txt * - * Copyright 1998-2006 Helma Software. All Rights Reserved. + * Copyright 1998-2007 Helma Software. All Rights Reserved. * - * $RCSfile: helma.Aspects.js,v $ + * $RCSfile: Aspects.js,v $ * $Author: czv $ - * $Revision: 1.9 $ - * $Date: 2006/04/18 13:06:58 $ + * $Revision: 1.2 $ + * $Date: 2006/04/24 07:02:17 $ */ +/** + * Define the global namespace if not existing + */ if (!global.helma) { global.helma = {}; } /** - * library for adding Aspects (by roman porotnikov, - * http://www.jroller.com/page/deep/20030701) - * + * Library for adding Aspects + *

+ * Provides static methods to wrap existing functions + * inside a javascript closure in order to add additional + * behavior without overriding the existing one. + *

+ * Based on code by roman porotnikov, + * http://www.jroller.com/page/deep/20030701 + *

* Note: Each prototype that uses aspects must implement a method * onCodeUpdate() to prevent aspects being lost when the prototype * is re-compiled */ - - helma.Aspects = function() { return this; }; @@ -44,6 +51,18 @@ helma.Aspects.prototype.toString = function() { }; +/** + * Adds a function to be called before the orginal function. + *

+ * The return value of the added function needs to provide the + * array of arguments that is passed to the original function. + * + * @param {Object} obj The object of which the original function is a property + * @param {String} fname The property name of the original function + * @param {Function} before The function to be called before the original function + * @returns Function A new function, wrapping the original function + * @type Function + */ helma.Aspects.prototype.addBefore = function(obj, fname, before) { var oldFunc = obj[fname]; obj[fname] = function() { @@ -53,6 +72,21 @@ helma.Aspects.prototype.addBefore = function(obj, fname, before) { }; +/** + * Adds a function to be called after an existing function. + *

+ * The return value of the original function is passed to the + * added function as its first argument. In addition, the added + * function also receives an array of the original arguments, + * the original function and the scope object of the original + * function as additional parameters. + * + * @param {Object} obj as Object, the object of which the original function is a property + * @param {String} fname as String, the property name of the original function + * @param {Function} after as Function, the function to be called after the original function + * @returns Function A new function, wrapping the original function + * @type Function + */ helma.Aspects.prototype.addAfter = function(obj, fname, after) { var oldFunc = obj[fname]; obj[fname] = function() { @@ -62,6 +96,20 @@ helma.Aspects.prototype.addAfter = function(obj, fname, after) { }; +/** + * Wraps an additional function around the original function. + *

+ * The added function receives as its arguments an array of the original + * arguments, the original function and the scope object of the original + * function. The original function is not called directly and needs + * to be invoked by the added function. + * + * @param {Object} obj as Object, the object of which the original function is a property + * @param {String} fname as String, the property name of the original function + * @param {Function} around as Function, the function to be called inside the original function + * @returns Function A new function, wrapping the original function + * @type Function + */ helma.Aspects.prototype.addAround = function(obj, fname, around) { var oldFunc = obj[fname]; obj[fname] = function() {