docs: function generate_controller(dir_name, controller, actions) {
  	name = uncamelcase(controller);
  	// create controller file
  	actions = actions.map(a => a.toLowerCase());
  	generate_controller_file(dir_name, name, actions.map((ca) => { return ca.split(':')[0]; }));
  	console.log(`create	app/controllers/${name}_controller.js`);
  	generate_socketed_controller_file(dir_name, name, actions.filter((ca) => { return ca.split(':').length == 1 || ca.split(':')[1] == 'get'}).map((ca) => { return ca.split(':')[0]; }));
  	console.log(`create	app/controllers/socketed_controllers/${name}_socketed_controller.js`);
  	// make asset directories
  	//// views
  	cli.mkdir(`${dir_name}/app/views/${name}`);
  	console.log(`create		${dir_name}/app/views/${name}`);
  	//// css
  	cli.mkdir(`${dir_name}/app/assets/css/${name}`);
  	console.log(`create		${dir_name}/app/assets/css/${name}`);
  	//// js
  	cli.mkdir(`${dir_name}/app/assets/js/${name}`);
  	console.log(`create		${dir_name}/app/assets/js/${name}`);
  	// add controller specific assets
  	//// css
  	cli.touch(`${dir_name}/app/assets/css/${name}/${name}.css`);
  	console.log(`create		${dir_name}/app/assets/css/${name}/${name}.css`);
  	//// js
  	cli.touch(`${dir_name}/app/assets/js/${name}/${name}.js`);
  	console.log(`create		${dir_name}/app/assets/js/${name}/${name}.js`);
  	// add route and route specific assets
  	let parts, action, method;
  	let routes = [];
  	for (let i = 0; i < actions.length; i++) {
  		parts = actions[i].split(':');
  		action = parts[0];
  		if (parts[1] && ROUTE_METHODS.includes(parts[1])) {
  			method = parts[1];
  		} else { method = 'get'; }
  		//// routes.js < route
  		console.log(`route	${method} '/${name}/${action}'`)
  		routes.push({
  			method: method,
  			path: `/${name}/${action}`,
  			controller: name,
  			action: action
  		});
  		//// create view + assets
  		generate_view(dir_name, name, action);
  	}
  	generate_routes(dir_name, name, routes);
  }