Abstract method list is now updated for classes that implement interfaces
parent
c12ac412cb
commit
0b112dac51
22
lib/class.js
22
lib/class.js
|
@ -49,8 +49,11 @@ exports.extend = function( base )
|
||||||
exports.implement = function()
|
exports.implement = function()
|
||||||
{
|
{
|
||||||
var len = arguments.length,
|
var len = arguments.length,
|
||||||
dest = exports.extend(),
|
dest = {},
|
||||||
arg = null;
|
arg = null,
|
||||||
|
|
||||||
|
abstract_list = []
|
||||||
|
implemented = [];
|
||||||
|
|
||||||
// add each of the interfaces
|
// add each of the interfaces
|
||||||
for ( var i = 0; i < len; i++ )
|
for ( var i = 0; i < len; i++ )
|
||||||
|
@ -58,11 +61,20 @@ exports.implement = function()
|
||||||
arg = arguments[ i ];
|
arg = arguments[ i ];
|
||||||
|
|
||||||
// copy all interface methods to the class (does not yet deep copy)
|
// copy all interface methods to the class (does not yet deep copy)
|
||||||
util.propCopy( arg.prototype, dest.prototype );
|
util.propCopy( arg.prototype, dest );
|
||||||
dest.implemented.push( arg );
|
implemented.push( arg );
|
||||||
}
|
}
|
||||||
|
|
||||||
return dest;
|
var class_new = exports.extend( dest );
|
||||||
|
|
||||||
|
// we cannot reassign the value since it is frozen, so copy the values into
|
||||||
|
// the array
|
||||||
|
while ( implemented[ 0 ] )
|
||||||
|
{
|
||||||
|
class_new.implemented.push( implemented.shift() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return class_new;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,3 +70,23 @@ assert.ok(
|
||||||
"Abstract methods are copied into the new class prototype"
|
"Abstract methods are copied into the new class prototype"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
Foo.isAbstract(),
|
||||||
|
true,
|
||||||
|
"Classes that implements interface(s) are considered abstract if the " +
|
||||||
|
"implemented methods have no concrete implementations"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
Foo.abstractMethods.length,
|
||||||
|
2,
|
||||||
|
"Abstract methods list is updated when interface is implemented"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.ok(
|
||||||
|
( ( Foo.abstractMethods[ 0 ] == 'foo' )
|
||||||
|
&& ( Foo.abstractMethods[ 1 ] == 'foo2' )
|
||||||
|
),
|
||||||
|
"Abstract methods list contains names of implemented methods"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue