public void register(Object obj) {
		for (Method method : obj.getClass().getMethods()) {
			Command command = method.getAnnotation(Command.class);
			if (command != null) {
				String name = command.value().isEmpty() ? method.getName() : command.value();
				name = name.startsWith("!") ? name : "!" + name;
				if (commandMap.containsKey(name)) {
					throw new IllegalArgumentException(String.format("Command '%s' is already registered.", name));
				}
				method.setAccessible(true);
				commandMap.put(name, new ShellCommandDefinition(obj, method));
			}
		}
	}