docs: function Component(opts) {
  	if (typeof opts === "function") {
  		var _constructor = opts;opts = null;
  		return register(_constructor);
  	}
  
  	opts = opts || {};
  	var _opts = opts;
  	var _opts$restrict = _opts.restrict;
  	var restrict = _opts$restrict === undefined ? "EA" : _opts$restrict;
  	var _opts$replace = _opts.replace;
  	var replace = _opts$replace === undefined ? false : _opts$replace;
  	var _opts$transclude = _opts.transclude;
  	var transclude = _opts$transclude === undefined ? false : _opts$transclude;
  	var _opts$scope = _opts.scope;
  	var scope = _opts$scope === undefined ? {} : _opts$scope;
  	var template = _opts.template;
  	var templateUrl = _opts.templateUrl;
  
  	return register;
  
  	function register(constructor) {
  		(0, _Controller.Controller)(constructor);
  		var meta = (0, _utils.funcMeta)(constructor);
  
  		var name = meta.name;
  		name = name[0].toLowerCase() + name.substr(1, name.length - DEFAULT_SUFFIX.length - 1);
  
  		if (!template && !templateUrl && template !== false) {
  			var tmplName = (0, _utils.dashCase)(name);
  			templateUrl = "./components/" + tmplName + "/" + tmplName + ".html";
  		}
  
  		if (template === false) {
  			template = undefined;
  			templateUrl = undefined;
  		}
  
  		_app.app.directive(name, function () {
  			return {
  				restrict: restrict,
  				scope: scope,
  				bindToController: true,
  				controller: meta.controller.name,
  				controllerAs: name,
  				template: template,
  				templateUrl: templateUrl,
  				replace: replace,
  				transclude: transclude
  			};
  		});
  	}
  }