1
0
Fork 0

Object class masquerading

master
Mike Gerwitz 2015-05-12 23:30:14 -04:00
parent 98e76be94f
commit 69e9828beb
3 changed files with 41 additions and 7 deletions

View File

@ -242,6 +242,30 @@ exports.getMeta = function( cls )
}
/**
* Allow OBJ to assume an identity as a class
*
* This is useful to use objects in situations where classes are expected,
* as it eliminates the need for handling of special cases.
*
* This is intended for internal use---there are no guarantees as to what
* methods ease.js may expect that a class-like object incorporate. That
* guarantee may exist in the future, but until then, stay away.
*
* @param {Object} obj object to masquerade as an ease.js class
*
* @return {Object} OBJ
*/
exports.masquerade = function( obj )
{
// XXX: this is duplicated; abstract
util.defineSecureProp( obj, _priv, {} );
createMeta( obj, exports.ClassBase );
return obj;
};
/**
* Determines if the class is an instance of the given type
*
@ -1461,4 +1485,3 @@ function attachFlags( ctor, props )
// (v8 performance)
props.___$$final$$ = props.___$$abstract$$ = undefined;
}

View File

@ -179,11 +179,6 @@ module.exports.isClass = function( obj )
{
obj = obj || _dummyclass;
if ( !obj.prototype )
{
return false;
}
var meta = ClassBuilder.getMeta( obj );
// TODO: we're checking a random field on the meta object; do something

View File

@ -24,7 +24,8 @@ require( 'common' ).testCase(
{
setUp: function()
{
this.Sut = this.require( 'class' );
this.Sut = this.require( 'class' );
this.ClassBuilder = this.require( 'ClassBuilder' );
this.Foo = this.Sut.extend(
{
@ -249,6 +250,21 @@ require( 'common' ).testCase(
},
/**
* There are cases---intended for internal use---where it is beneficial
* for an object to be treated as though it were actually a class.
*/
'Any object may masquerade as a class': function()
{
var obj = {};
// XXX: tightly coupled logic here; refactor things
this.ClassBuilder.masquerade( obj );
this.assertOk( this.Sut.isClass( obj ) );
},
/**
* This really should be encapsulated, probably, but it does exist for
* reference.