Support for named trait class extending
We can call this a bugfix...it's more of a neglected feature that's otherwise completely inconsistent with the rest of the system. :) * lib/Trait.js (createNamedTrait): Support base. (_createStaging) [extend]: Support base. * test/Trait/NamedTest.js: Add test.master
parent
017b85d75b
commit
e93f3a70f9
21
lib/Trait.js
21
lib/Trait.js
|
@ -63,11 +63,12 @@ function Trait()
|
||||||
* Create a named trait
|
* Create a named trait
|
||||||
*
|
*
|
||||||
* @param {string} name trait name
|
* @param {string} name trait name
|
||||||
* @param {Object} def trait definition
|
* @param {Object} dfn trait definition
|
||||||
|
* @param {Object=} base extension base
|
||||||
*
|
*
|
||||||
* @return {Function} named trait
|
* @return {Function} named trait
|
||||||
*/
|
*/
|
||||||
function createNamedTrait( name, dfn )
|
function createNamedTrait( name, dfn, base )
|
||||||
{
|
{
|
||||||
if ( typeof name !== 'string' )
|
if ( typeof name !== 'string' )
|
||||||
{
|
{
|
||||||
|
@ -77,16 +78,26 @@ function createNamedTrait( name, dfn )
|
||||||
}
|
}
|
||||||
|
|
||||||
dfn.__name = name;
|
dfn.__name = name;
|
||||||
return Trait.extend( dfn );
|
|
||||||
|
var args = [ dfn ];
|
||||||
|
if ( base !== undefined )
|
||||||
|
{
|
||||||
|
args.unshift( base );
|
||||||
|
}
|
||||||
|
|
||||||
|
return Trait.extend.apply( null, args );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function _createStaging( name )
|
function _createStaging( name )
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
extend: function( dfn )
|
extend: function( /*...*/ )
|
||||||
{
|
{
|
||||||
return createNamedTrait( name, dfn );
|
// [base, ]dfn
|
||||||
|
return ( arguments.length === 1 )
|
||||||
|
? createNamedTrait( name, arguments[ 0 ] )
|
||||||
|
: createNamedTrait( name, arguments[ 1 ], arguments[ 0 ] );
|
||||||
},
|
},
|
||||||
|
|
||||||
implement: function()
|
implement: function()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* Tests named trait definitions
|
* Tests named trait definitions
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Free Software Foundation, Inc.
|
* Copyright (C) 2014, 2016 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GNU ease.js.
|
* This file is part of GNU ease.js.
|
||||||
*
|
*
|
||||||
|
@ -167,4 +167,48 @@ require( 'common' ).testCase(
|
||||||
// ensure that trait was properly named
|
// ensure that trait was properly named
|
||||||
this.assertOk( T.toString().match( name ) );
|
this.assertOk( T.toString().match( name ) );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The extend method on the named staging object should work just as
|
||||||
|
* Trait.extend.
|
||||||
|
*/
|
||||||
|
'Can extend class using named trait staging object': function()
|
||||||
|
{
|
||||||
|
var Sut = this.Sut,
|
||||||
|
name = "Extended",
|
||||||
|
expected = {},
|
||||||
|
T = null;
|
||||||
|
|
||||||
|
var C = this.Class(
|
||||||
|
{
|
||||||
|
_foo: null,
|
||||||
|
|
||||||
|
getFoo: function() { return expected; },
|
||||||
|
} );
|
||||||
|
|
||||||
|
this.assertDoesNotThrow( function()
|
||||||
|
{
|
||||||
|
T = Sut( name )
|
||||||
|
.extend( C,
|
||||||
|
{
|
||||||
|
get: function() { return this.getFoo(); },
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// should be okay if properly extended
|
||||||
|
this.assertStrictEqual(
|
||||||
|
expected,
|
||||||
|
C.use( T )().get()
|
||||||
|
);
|
||||||
|
|
||||||
|
// should _not_ be
|
||||||
|
this.assertThrows( function()
|
||||||
|
{
|
||||||
|
this.Class.use( T )();
|
||||||
|
} );
|
||||||
|
|
||||||
|
// ensure that trait was properly named
|
||||||
|
this.assertOk( T.toString().match( name ) );
|
||||||
|
},
|
||||||
} );
|
} );
|
||||||
|
|
Loading…
Reference in New Issue