public CLIController() {
			Action exitAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					stopped = true;
				}
			};
			
			Action debugAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					int i = args.fetchInteger();
					Debugger.setLevel(i);
				}
			};

			Action debugTrackAddAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					String tag = args.pop();
					Debugger.trackAdd(tag);
				}
			};

			Action debugTrackRemoveAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					String tag = args.pop();
					Debugger.trackRemove(tag);
				}
			};

			Action debugTrackListAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					Set<String> tags = Debugger.seenTags();
					System.out.println("Seen tags:");
					for(String s: tags) {
						System.out.println("\t " + s);
					}
				}
			};

			Action scriptAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					while(args.hasArg()) {
						String path = args.pop();
						try {
							File f = new File(path);
							BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
							String s;
							do {
								s = br.readLine();
								if(s != null) {
									controller.handle(new ArgSet(s));
								}
							} while(s != null);
							br.close();
						} catch(FileNotFoundException e) {
							System.out.println("[CommandLineInterface] The file " + path + " does not exist.");
						} catch(IOException e) {
							System.out.println("[CommandLineInterface] An error occurred while reading from file " + path);
							e.printStackTrace();
							return;
						}
					}

				}
			};

			Action echoAction = new Action() {
				@Override
				public void execute(ArgSet args) {
					if(args.hasStringArg()) {
						System.out.println(args.fetchString());
					} else if(args.hasArg()) {
						System.out.println(args.pop());
					} else {
						System.out.println("[CommandLineInterface] the command \"echo\" requires an argument enclosed by quotation marks");
					}
				}
			};
			
			Action innerAction = new CommandAction(innerController);
			
			mapCommand("exit", exitAction);
			getContext("debug").mapCommand("level", debugAction);
			getContext("debug").getContext("track").mapCommand("add", debugTrackAddAction);
			getContext("debug").getContext("track").mapCommand("remove", debugTrackRemoveAction);
			getContext("debug").getContext("track").mapCommand("list", debugTrackListAction);
			mapAbbreviation('r', scriptAction);
			mapCommand("run", scriptAction);
			mapCommand("echo", echoAction);
			setDefaultAction(innerAction);
		}