diff --git a/lib/class.js b/lib/class.js index effbdb5..59fd64f 100644 --- a/lib/class.js +++ b/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 diff --git a/test/test-class-name.js b/test/test-class-name.js index 6fbf3fa..4d40508 100644 --- a/test/test-class-name.js +++ b/test/test-class-name.js @@ -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" + ); } )();