docs: function() {
  			Construct.setup.apply(this, arguments);
  
  			// When `Component.setup` function is ran for the first time, `Component` doesn't exist yet
  			// which ensures that the following code is ran only in constructors that extend `Component`.
  			if (Component) {
  				var self = this;
  
  				// Define a control using the `events` prototype property.
  				if(this.prototype.events !== undefined && canReflect.size(this.prototype.events) !== 0) {
  					this.Control = ComponentControl.extend(this.prototype.events);
  				}
  
  				//!steal-remove-start
  				if (process.env.NODE_ENV !== 'production') {
  					// If a constructor is assigned to the viewModel, give a warning
  					if (this.prototype.viewModel && canReflect.isConstructorLike(this.prototype.viewModel)) {
  						canDev.warn("can-component: Assigning a DefineMap or constructor type to the viewModel property may not be what you intended. Did you mean ViewModel instead? More info: https://canjs.com/doc/can-component.prototype.ViewModel.html");
  					}
  				}
  				//!steal-remove-end
  
  				// Look at viewModel, scope, and ViewModel properties and set one of:
  				//  - this.viewModelHandler
  				//  - this.ViewModel
  				//  - this.viewModelInstance
  				var protoViewModel = this.prototype.viewModel || this.prototype.scope;
  
  				if(protoViewModel && this.prototype.ViewModel) {
  					throw new Error("Cannot provide both a ViewModel and a viewModel property");
  				}
  				var vmName = string.capitalize( string.camelize(this.prototype.tag) )+"VM";
  				if(this.prototype.ViewModel) {
  					if(typeof this.prototype.ViewModel === "function") {
  						this.ViewModel = this.prototype.ViewModel;
  					} else {
  						this.ViewModel = DefineMap.extend(vmName, {}, this.prototype.ViewModel);
  					}
  				} else {
  
  					if(protoViewModel) {
  						if(typeof protoViewModel === "function") {
  							if(canReflect.isObservableLike(protoViewModel.prototype) && canReflect.isMapLike(protoViewModel.prototype)) {
  								this.ViewModel = protoViewModel;
  							} else {
  								this.viewModelHandler = protoViewModel;
  							}
  						} else {
  							if(canReflect.isObservableLike(protoViewModel) && canReflect.isMapLike(protoViewModel)) {
  								//!steal-remove-start
  								if (process.env.NODE_ENV !== 'production') {
  									canLog.warn("can-component: "+this.prototype.tag+" is sharing a single map across all component instances");
  								}
  								//!steal-remove-end
  								this.viewModelInstance = protoViewModel;
  							} else {
  								canLog.warn("can-component: "+this.prototype.tag+" is extending the viewModel into a can-simple-map");
  								this.ViewModel = SimpleMap.extend(vmName,{},protoViewModel);
  							}
  						}
  					} else {
  						this.ViewModel = SimpleMap.extend(vmName,{},{});
  					}
  				}
  
  				// Convert the template into a renderer function.
  				if (this.prototype.template) {
  					//!steal-remove-start
  					if (process.env.NODE_ENV !== 'production') {
  						canLog.warn('can-component.prototype.template: is deprecated and will be removed in a future release. Use can-component.prototype.view');
  					}
  					//!steal-remove-end
  					this.view = this.prototype.template;
  				}
  				if (this.prototype.view) {
  					this.view = this.prototype.view;
  				}
  
  				// default to stache if renderer is a string
  				if (typeof this.view === "string") {
  					var viewName = string.capitalize( string.camelize(this.prototype.tag) )+"View";
  					this.view = stache(viewName, this.view);
  				}
  
  				// TODO: Remove in next release.
  				this.renderer = this.view;
  
  				var renderComponent = function(el, tagData) {
  					// Check if a symbol already exists on the element; if it does, then
  					// a new instance of the component has already been created
  					if (el[createdByCanComponentSymbol] === undefined) {
  						new self(el, tagData);
  					}
  				};
  
  				//!steal-remove-start
  				if (process.env.NODE_ENV !== 'production') {
  					Object.defineProperty(renderComponent, "name",{
  						value: "render <"+this.prototype.tag+">",
  						configurable: true
  					});
  					renderComponent = queues.runAsTask(renderComponent, function(el, tagData) {
  						return ["Rendering", el, "with",tagData.scope];
  					});
  				}
  				//!steal-remove-end
  
  				// Register this component to be created when its `tag` is found.
  				viewCallbacks.tag(this.prototype.tag, renderComponent);
  			}
  		}