1
0
Fork 0

Refactored method override logic into its own function

closure/master
Mike Gerwitz 2010-11-14 21:50:56 -05:00
parent 1a9cc40c31
commit 3f169d87ea
1 changed files with 39 additions and 24 deletions

View File

@ -172,31 +172,9 @@ function prop_copy( props, dest, result_data )
// check for method overrides
else if ( ( pre !== undefined ) && ( pre instanceof Function ) )
{
// ensure we're overriding the method with another method
if ( !( prop instanceof Function ) )
{
throw new TypeError( "Cannot override method with non-method" );
}
dest[ property ] = ( function( method, super_method )
{
// this is the method that will be invoked when the requested
// method is called, so note that in the context of this
// function, `this` will represent the current class instance
return function()
{
var tmp = this.__super;
// assign _super temporarily for the method invocation so
// that the method can call the parent method
this.__super = super_method;
var retval = method.apply( this, arguments );
this.__super = tmp;
return retval;
}
})( prop, dest[ property ] );
dest[ property ] = method_override( pre, prop );
}
// just copy over the property
else
{
dest[ property ] = prop;
@ -212,6 +190,42 @@ function prop_copy( props, dest, result_data )
}
/**
* Overrides a method
*
* The given method must be a function or an exception will be thrown.
*
* @param {Function} super_method method to override
* @param {Function} new_method method to override with
*
* @return {Function} overridden method
*/
function method_override( super_method, new_method )
{
// ensure we're overriding the method with another method
if ( !( new_method instanceof Function ) )
{
throw new TypeError( "Cannot override method with non-method" );
}
// this is the method that will be invoked when the requested
// method is called, so note that in the context of this
// function, `this` will represent the current class instance
return function()
{
var tmp = this.__super;
// assign _super temporarily for the method invocation so
// that the method can call the parent method
this.__super = super_method;
var retval = new_method.apply( this, arguments );
this.__super = tmp;
return retval;
}
}
/**
* Shrinks an array, removing undefined elements
*
@ -422,3 +436,4 @@ function attach_extend( func )
// less restrictive)
define_secure_prop( func, 'extend', ext_method );
}