Implemented staging-style named class definition when implementing interfaces
parent
8749228764
commit
2c2701f4ab
24
lib/class.js
24
lib/class.js
|
@ -308,6 +308,17 @@ function createStaging( cname )
|
|||
|
||||
return extend.apply( null, args );
|
||||
},
|
||||
|
||||
implement: function()
|
||||
{
|
||||
// implement on empty base, providing the class name to be used once
|
||||
// extended
|
||||
return createImplement(
|
||||
extend( {} ),
|
||||
Array.prototype.slice.call( arguments ),
|
||||
cname
|
||||
);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -320,12 +331,13 @@ function createStaging( cname )
|
|||
* called, as it does not make sense to create a class without any
|
||||
* body/definition.
|
||||
*
|
||||
* @param {Object} base base class to implement atop of
|
||||
* @param {Array} ifaces interfaces to implement
|
||||
* @param {Object} base base class to implement atop of
|
||||
* @param {Array} ifaces interfaces to implement
|
||||
* @param {string=} cname optional class name once extended
|
||||
*
|
||||
* @return {Object} intermediate implementation object
|
||||
*/
|
||||
function createImplement( base, ifaces )
|
||||
function createImplement( base, ifaces, cname )
|
||||
{
|
||||
ifaces.push( base );
|
||||
|
||||
|
@ -334,6 +346,12 @@ function createImplement( base, ifaces )
|
|||
return {
|
||||
extend: function( def )
|
||||
{
|
||||
// if a name was provided, use it
|
||||
if ( cname )
|
||||
{
|
||||
def.__name = cname;
|
||||
}
|
||||
|
||||
return extend.apply( null, [
|
||||
implement.apply( this, ifaces ),
|
||||
def
|
||||
|
|
|
@ -24,7 +24,9 @@
|
|||
|
||||
var common = require( './common' ),
|
||||
assert = require( 'assert' ),
|
||||
Class = common.require( 'class' )
|
||||
|
||||
Class = common.require( 'class' ),
|
||||
Interface = common.require( 'interface' )
|
||||
;
|
||||
|
||||
|
||||
|
@ -158,8 +160,9 @@ var common = require( './common' ),
|
|||
*/
|
||||
( function testCanCreateNamedClassUsingStagingMethod()
|
||||
{
|
||||
var name = 'Foo',
|
||||
named = Class( name ).extend( {} )
|
||||
var name = 'Foo',
|
||||
named = Class( name ).extend( {} )
|
||||
namedi = Class( name ).implement( Interface( {} ) ).extend( {} )
|
||||
;
|
||||
|
||||
// ensure what was returned is a valid class
|
||||
|
@ -176,5 +179,20 @@ var common = require( './common' ),
|
|||
'[object Class <' + name + '>]',
|
||||
"Name is set on named clas via staging method"
|
||||
);
|
||||
|
||||
|
||||
// we should also be able to implement interfaces
|
||||
assert.equal(
|
||||
Class.isClass( namedi ),
|
||||
true,
|
||||
"Named class generated via staging method, implementing an " +
|
||||
"interface, is considered to be a valid class"
|
||||
);
|
||||
|
||||
assert.equal(
|
||||
namedi.toString(),
|
||||
'[object Class <' + name + '>]',
|
||||
"Name is set on named class via staging method when implementing"
|
||||
);
|
||||
} )();
|
||||
|
||||
|
|
Loading…
Reference in New Issue