docs: function( model, attr, options ) {
  			// Don't accept recursive calls to onChange (like onChange->findRelated->findOrCreate->initializeRelations->addRelated->onChange)
  			if ( this.isLocked() ) {
  				return;
  			}
  			this.acquire();
  			options = this.sanitizeOptions( options );
  			
  			// 'options._related' is set by 'addRelated'/'removeRelated'. If it is set, the change
  			// is the result of a call from a relation. If it's not, the change is the result of 
  			// a 'set' call on this.instance.
  			var changed = _.isUndefined( options._related );
  			var oldRelated = changed ? this.related : options._related;
  			
  			if ( changed ) {	
  				this.keyContents = attr;
  				
  				// Set new 'related'
  				if ( attr instanceof this.relatedModel ) {
  					this.related = attr;
  				}
  				else if ( attr ) {
  					var related = this.findRelated( options );
  					this.setRelated( related );
  				}
  				else {
  					this.setRelated( null );
  				}
  			}
  			
  			// Notify old 'related' object of the terminated relation
  			if ( oldRelated && this.related !== oldRelated ) {
  				_.each( this.getReverseRelations( oldRelated ), function( relation ) {
  						relation.removeRelated( this.instance, options );
  					}, this );
  			}
  			
  			// Notify new 'related' object of the new relation. Note we do re-apply even if this.related is oldRelated;
  			// that can be necessary for bi-directional relations if 'this.instance' was created after 'this.related'.
  			// In that case, 'this.instance' will already know 'this.related', but the reverse might not exist yet.
  			_.each( this.getReverseRelations(), function( relation ) {
  					relation.addRelated( this.instance, options );
  				}, this);
  			
  			// Fire the 'update:<key>' event if 'related' was updated
  			if ( !options.silentChange && this.related !== oldRelated ) {
  				var dit = this;
  				Backbone.Relational.eventQueue.add( function() {
  					dit.instance.trigger( 'update:' + dit.key, dit.instance, dit.related, options );
  				});
  			}
  			this.release();
  		}