digraph systemModel {
	rankdir="LR";
	splines="line";

	subgraph _clusterModels {
		label="Models"
		node[shape="record"];

		//BaseModel[label="<main> ActiveRecord::Base (abstract)"]

		Server[label="<main> Server"];
		Tournament[label="<main> Tournament"];
		Match[label="<main> Match"];
		Team[label="<main> Team"];
		User[label="<main> User | <attr_role> role | <attr_pw> password hash"];
	}

	subgraph _clusterViews {
		label="views/";
		node[shape="rectangle"]

		/*
		layouts_application[label="layouts/application (abstract)"]
		subgraph clusterViewsCommon {
			label="views/common/";
			common_permission_denied[label="common/permission_denied"];
			common_invalid[label="common/invalid"];
		}
		*/
		subgraph clusterViewsMain {
			label="views/main/";
			main_homepage[label="main/homepage"];
			main_edit[label="main/edit"];
		}
		search_results[label="search/results"];
		subgraph clusterViewsMessages {
			label="views/messages/";
			messages_new_alert[label="messages/new_alert"];
			messages_private[label="messages/private"];
		}
		subgraph clusterViewsTournament {
			label="views/tournament/";
			tournaments_index[label="tournaments/index"];
			tournaments_show[label="tournaments/show"];
			tournaments_new[label="tournaments/new"];
			tournaments_edit[label="tournaments/edit"];
		}
		subgraph clusterViewsMatches {
			label="views/matches/";
			matches_show[label="matches/show"];
			matches_edit[label="matches/edit"];
		}
		subgraph clusterViewsTeams {
			label="views/teams/";
			teams_index[label="teams/index"];
			teams_show[label="teams/show"];
			teams_new[label="teams/new"];
			teams_edit[label="teams/edit"];
		}
		subgraph clusterViewsUsers {
			label="views/users/";
			users_index[label="users/index"];
			users_new[label="users/new"];
			users_show[label="users/show"];
			users_edit[label="users/edit"];
		}
	}

	subgraph _clusterControllers {
		label="Controllers";
		node[shape="record"];

		//ApplicationController[label="<main> ApplicationController (abstract)"];

		MainController[label="<main> MainController | <index> show_homepage() | <edit> edit_settings() | <update> update_settings()"];
		LoginController[label="<main> LoginController | <login> login() | <logout> logout()"];
		SearchController[label="<main> SearchController | <show_results> show_results()"];
		MessagesController[label="<main> MessagesController | <new_alert> new_alert() | <post_alert> post_alert() | <show_private> show_private() | <post_private> post_private()"];
		TournamentsController[label="<main> TournamentsController | <index> index() | <show> show() | <new> new() | <create> create() | <edit> edit() | <update> update() | <end> end()"];
		MatchesController[label="<main> MatchesController | <index> index() | <show> show() | <edit> edit() | <update> update()"];
		TeamsController[label="<main> TeamsController | <index> index() | <show> show() | <edit> edit() | <update> update()"]
		UsersController[label="<main> UsersController | <index> index() | <show> show() | <new> new() | <create> create() | <edit> edit() | <update> update() | <delete> delete()"]
	}

	/*
	subgraph inheritance {
		# Kludge: Have a arrow going both ways, but one invisible, so
		# that it doesn't try to force a position

		# models

		Server:main -> BaseModel[arrowhead=onormal];
		BaseModel -> Server:main[style=invis];

		Tournament:main -> BaseModel[arrowhead=onormal];
		BaseModel -> Tournament:main[style=invis];

		Match:main -> BaseModel[arrowhead=onormal];
		BaseModel -> Match:main[style=invis];

		Team:main -> BaseModel[arrowhead=onormal];
		BaseModel -> Team:main[style=invis];

		User:main -> BaseModel[arrowhead=onormal];
		BaseModel -> User:main[style=invis];

		# views

		common_permission_denied -> layouts_application[arrowhead=onormal];
		layouts_application -> common_permission_denied[style=invis];

		common_invalid -> layouts_application[arrowhead=onormal];
		layouts_application -> common_invalid[style=invis];

		main_homepage -> layouts_application[arrowhead=onormal];
		layouts_application -> main_homepage[style=invis];

		main_edit -> layouts_application[arrowhead=onormal];
		layouts_application -> main_edit[style=invis];

		messages_new_alert -> layouts_application[arrowhead=onormal];
		layouts_application -> messages_new_alert[style=invis];

		messages_private -> layouts_application[arrowhead=onormal];
		layouts_application -> messages_private[style=invis];

		tournaments_index -> layouts_application[arrowhead=onormal];
		layouts_application -> tournaments_index[style=invis];

		tournaments_show -> layouts_application[arrowhead=onormal];
		layouts_application -> tournaments_show[style=invis];

		tournaments_new -> layouts_application[arrowhead=onormal];
		layouts_application -> tournaments_new[style=invis];

		tournaments_edit -> layouts_application[arrowhead=onormal];
		layouts_application -> tournaments_edit[style=invis];

		matches_show -> layouts_application[arrowhead=onormal];
		layouts_application -> matches_show[style=invis];

		matches_edit -> layouts_application[arrowhead=onormal];
		layouts_application -> matches_edit[style=invis];

		teams_index -> layouts_application[arrowhead=onormal];
		layouts_application -> teams_index[style=invis];

		teams_show -> layouts_application[arrowhead=onormal];
		layouts_application -> teams_show[style=invis];

		teams_new -> layouts_application[arrowhead=onormal];
		layouts_application -> teams_new[style=invis];

		teams_edit -> layouts_application[arrowhead=onormal];
		layouts_application -> teams_edit[style=invis];

		users_index -> layouts_application[arrowhead=onormal];
		layouts_application -> users_index[style=invis];

		users_new -> layouts_application[arrowhead=onormal];
		layouts_application -> users_new[style=invis];

		users_show -> layouts_application[arrowhead=onormal];
		layouts_application -> users_show[style=invis];

		users_edit -> layouts_application[arrowhead=onormal];
		layouts_application -> users_edit[style=invis];

		# controllers

		MainController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> MainController:main[style=invis];

		TournamentsController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> TournamentsController:main[style=invis];

		MessagesController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> MessagesController:main[style=invis];

		LoginController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> LoginController:main[style=invis];

		SearchController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> SearchController:main[style=invis];

		UsersController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> UsersController:main[style=invis];

		MatchesController:main -> ApplicationController[arrowhead="onormal"];
		ApplicationController -> MatchesController:main[style=invis];
	}
	*/

	###################################################################
	# controller/view relations
	###################################################################
	MainController:index -> main_homepage;
	MainController:edit -> main_edit -> MainController:update -> main_edit;

	#LoginController:login -> common_permission_denied;
	#LoginController:logout -> common_invalid;

	SearchController:show_results -> search_results;

	MessagesController:new_alert -> messages_new_alert -> MessagesController:post_alert;
	MessagesController:show_private -> messages_private -> MessagesController:post_private -> messages_private;

	TournamentsController:index -> tournaments_index;
	TournamentsController:show -> tournaments_show;
	TournamentsController:new -> tournaments_new -> TournamentsController:create -> tournaments_edit -> TournamentsController:end;
	TournamentsController:edit -> tournaments_edit -> TournamentsController:update -> tournaments_edit;

	MatchesController:show -> matches_show;
	MatchesController:edit -> matches_edit -> MatchesController:update -> matches_edit;

	TeamsController:index -> teams_index;
	TeamsController:show -> teams_show;
	TeamsController:edit -> teams_edit -> TeamsController:update -> teams_edit;

	UsersController:index -> users_index;
	UsersController:show -> users_show;
	UsersController:new -> users_new -> UsersController:create -> users_edit -> UsersController:delete;
	UsersController:edit -> users_edit -> UsersController:update -> users_edit;

	###################################################################
	# controller/model relations
	###################################################################
	Server:main -> MainController:edit;
	MainController:update -> Server:main;

	User:main -> LoginController:login;

	Tournament:main -> SearchController:show_results;
	Match:main -> SearchController:show_results;
	Team:main -> SearchController:show_results;
	User:main -> SearchController:show_results;

	Tournament:main -> TournamentsController:index;
	Tournament:main -> TournamentsController:show;
	Match:main -> TournamentsController:show;
	Tournament:main -> TournamentsController:edit;
	TournamentsController:create -> Tournament:main;
	TournamentsController:update -> Tournament:main;
	TournamentsController:end -> Tournament:main;

	Match:main -> MatchesController:index;
	Match:main -> MatchesController:show;
	Team:main -> MatchesController:show;
	User:main -> MatchesController:show;
	Match:main -> MatchesController:edit;
	MatchesController:update -> Match:main;

	Team:main -> TeamsController:index;
	Team:main -> TeamsController:show;
	User:main -> TeamsController:show;
	Team:main -> TeamsController:edit;
	TeamsController:update -> Team:main;

	User:main -> UsersController:index;
	User:main -> UsersController:show;
	User:main -> UsersController:edit;
	UsersController:create -> User:main;
	UsersController:update -> User:main;
	UsersController:delete -> User:main;
}