docs: function addContext(el, tagData, insertionElementTagData) {
  	var vm,
  		newScope;
  
  	// Prevent setting up bindings manually.
  	domData.set(el, "preventDataBindings", true);
  
  	var teardown = stacheBindings.behaviors.viewModel(el, insertionElementTagData,
  		// `createViewModel` is used to create the ViewModel that the
  		// bindings will operate on.
  		function createViewModel(initialData, hasDataBinding, bindingState) {
  
  			if(bindingState && bindingState.isSettingOnViewModel === true) {
  				// If we are setting a value like `x:from="y"`,
  				// we need to make a variable scope.
  				newScope = tagData.scope.addLetContext(initialData);
  				return newScope._context;
  
  			} else {
  				// If we are setting the ViewModel itself, we
  				// stick the value in an observable: `this:from="value"`.
  				return vm = new SimpleObservable(initialData);
  			}
  		}, undefined, true);
  
  	if(!teardown) {
  		// If no teardown, there's no bindings, no need to change the scope.
  		return tagData;
  	} else {
  		// Copy `tagData` and overwrite the scope.
  		return assign( assign({}, tagData), {
  			teardown: teardown,
  			scope: newScope || tagData.scope.add(vm)
  		});
  	}
  }