@Override
	public boolean onCommand(CommandSender sender, Command command, String label,
			String[] args) {
		
		if (args.length == 0) {
			return help(sender);
		}
		
		String cmd = args[0];
		
		if (!commands.containsKey(cmd.toLowerCase())) {
			return help(sender);
		}
		
		try {
			Method m = getClass().getMethod(cmd, CommandSender.class, String[].class);
		
			if (!hasCommandPermission(sender, cmd)) {
				sender.sendMessage(ChatColor.RED + "You've no permission to use this command.");
				return true;
			} else {
				return (Boolean) m.invoke(this, sender, reduceArgs(args));
			}
		} catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            return help(sender);
        }
		
		return false;		
	}