docs: function() {
  			// If this Model has already been fully serialized in this branch once, return to avoid loops
  			if ( this.isLocked() ) {
  				return this.id;
  			}
  			
  			this.acquire();
  			var json = Backbone.Model.prototype.toJSON.call( this );
  			
  			if ( this.constructor._superModel && !( this.constructor._subModelTypeAttribute in json ) ) {
  				json[ this.constructor._subModelTypeAttribute ] = this.constructor._subModelTypeValue;
  			}
  			
  			_.each( this._relations, function( rel ) {
  					var value = json[ rel.key ];
  
  					if ( rel.options.includeInJSON === true) {
  						if ( value && _.isFunction( value.toJSON ) ) {
  							json[ rel.keyDestination ] = value.toJSON();
  						}
  						else {
  							json[ rel.keyDestination ] = null;
  						}
  					}
  					else if ( _.isString( rel.options.includeInJSON ) ) {
  						if ( value instanceof Backbone.Collection ) {
  							json[ rel.keyDestination ] = value.pluck( rel.options.includeInJSON );
  						}
  						else if ( value instanceof Backbone.Model ) {
  							json[ rel.keyDestination ] = value.get( rel.options.includeInJSON );
  						}	
  						else {
  							json[ rel.keyDestination ] = null;
  						}
  					}
  					else if ( _.isArray( rel.options.includeInJSON ) ) {
  						if ( value instanceof Backbone.Collection ) {
  							var valueSub = [];
  							value.each( function( model ) {
  								var curJson = {};
  								_.each( rel.options.includeInJSON, function( key ) {
  									curJson[ key ] = model.get( key );
  								});
  								valueSub.push( curJson );
  							});
  							json[ rel.keyDestination ] = valueSub;
  						}
  						else if ( value instanceof Backbone.Model ) {
  							var valueSub = {};
  							_.each( rel.options.includeInJSON, function( key ) {
  								valueSub[ key ] = value.get( key );
  							});
  							json[ rel.keyDestination ] = valueSub;
  						}
  						else {
  							json[ rel.keyDestination ] = null;
  						}
  					}
  					else {
  						delete json[ rel.key ];
  					}
  
  					if ( rel.keyDestination !== rel.key ) {
  						delete json[ rel.key ];
  					}
  				});
  			
  			this.release();
  			return json;
  		}