@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		if (args.length == 0) {
			sendHelp(sender);
			return true;
		}
		
		HSCommand command = getSubCommand(args[0]);
		if (command == null) {
			sender.sendMessage(I18N.getMessage("unknownCommand"));
			return true;
		}
		if (args.length > 1 && (args[1].equalsIgnoreCase("help") || args[1].equalsIgnoreCase("?"))) {
			Help help = command.getHelp();
			sender.sendMessage(ChatColor.YELLOW + "Usage: " + help.getRawUsage());
			sender.sendMessage(ChatColor.YELLOW + help.getHelp());
			
			return true;
		}
		
		Vector<String> cutArgs = new Vector<String>(Arrays.asList(args));
		cutArgs.remove(0);
		
		if (!isValidSubCommand(sender, command, cutArgs.toArray(new String[cutArgs.size()])))
			return true;
		
		command.execute(sender, cutArgs.toArray(new String[cutArgs.size()]));
		return true;
	}