docs: function getSetupFunctionForComponentVM(componentInitVM) {
  
  
  	return ObservationRecorder.ignore(function(el, componentTagData, makeViewModel, initialVMData) {
  
  		var bindingContext = {
  			element: el,
  			scope: componentTagData.scope,
  			parentNodeList: componentTagData.parentNodeList,
  			viewModel: undefined
  		};
  
  		var bindingSettings = {};
  
  		var bindings = [];
  
  		// Loop through all viewModel props and create dataBindings.
  		canReflect.eachKey(componentInitVM, function(parent, propName) {
  
  			var canGetParentValue = parent != null && !!parent[getValueSymbol];
  			var canSetParentValue = parent != null && !!parent[setValueSymbol];
  
  			// If we can get or set the value, then we’ll create a binding
  			if (canGetParentValue === true || canSetParentValue) {
  
  				// Create an observable for reading/writing the viewModel
  				// even though it doesn't exist yet.
  				var child = stacheBindings.getObservableFrom.viewModel({
  					name: propName,
  				}, bindingContext, bindingSettings);
  
  				// Create the binding similar to what’s in can-stache-bindings
  				var canBinding = new Bind({
  					child: child,
  					parent: parent,
  					queue: "domUI",
  
  					//!steal-remove-start
  					// For debugging: the names that will be assigned to the updateChild
  					// and updateParent functions within can-bind
  					updateChildName: "update viewModel." + propName + " of <" + el.nodeName.toLowerCase() + ">",
  					updateParentName: "update " + canReflect.getName(parent) + " of <" + el.nodeName.toLowerCase() + ">"
  					//!steal-remove-end
  				});
  
  				bindings.push({
  					binding: canBinding,
  					siblingBindingData: {
  						parent: {
  							source: "scope",
  							exports: canGetParentValue
  						},
  						child: {
  							source: "viewModel",
  							exports: canSetParentValue,
  							name: propName
  						}
  					}
  				});
  
  			} else {
  				// Can’t get or set the value, so assume it’s not an observable
  				initialVMData[propName] = parent;
  			}
  		});
  
  		// Initialize the viewModel.  Make sure you
  		// save it so the observables can access it.
  		var initializeData = stacheBindings.behaviors.initializeViewModel(bindings, initialVMData, function(properties){
  			return bindingContext.viewModel = makeViewModel(properties);
  		}, bindingContext);
  
  		// Return a teardown function
  		return function() {
  			for (var attrName in initializeData.onTeardowns) {
  				initializeData.onTeardowns[attrName]();
  			}
  		};
  	});
  }