@Override
 public boolean hasPermission(String parameter, Permissible permissible) {
   final String[] flagComponents = parameter.substring(1).split("=");
   Flag flag;
   try {
     flag = Flag.valueOf(flagComponents[0].replace("-", "_").toUpperCase());
   } catch (final IllegalArgumentException ex) {
     return false;
   }
   return flag.hasPermission(permissible);
 }
  @Override
  public List<String> tabComplete(String partialParameter, CommandSender sender) {
    final String[] flagComponents = partialParameter.substring(1).split("=", 2);
    Flag flag;
    final String name = flagComponents[0].replace("-", "_").toUpperCase();
    try {
      flag = Flag.valueOf(name);
    } catch (final IllegalArgumentException ex) {
      final List<String> completions = new ArrayList<String>();
      for (final Flag possibleFlag : Flag.values()) {
        final String flagName = possibleFlag.toString();
        if (flagName.startsWith(name)) {
          completions.add("-" + flagName.replace('_', '-').toLowerCase());
        }
      }
      return completions;
    }

    // Flag has a value
    if (flagComponents.length <= 1) {
      return null;
    }

    String prefix = "-" + flag.toString().replace('_', '-').toLowerCase() + "=";
    if (flag.equals(Flag.SHARE)) {
      final String value = flagComponents[1];
      final int end = value.lastIndexOf(',');
      String partialName = value;
      if (end != -1) {
        partialName = value.substring(end + 1);
        prefix = prefix + value.substring(0, end) + ",";
      }
      partialName = partialName.toLowerCase();
      final List<String> completions = new ArrayList<String>();
      for (final Player player : Bukkit.getOnlinePlayers()) {
        if (player.getName().toLowerCase().startsWith(partialName))
          completions.add(prefix + player.getName());
      }
      return completions;
    }
    return null;
  }
  @Override
  public void process(QueryParameters query, String parameter, CommandSender sender) {
    final String[] flagComponents = parameter.substring(1).split("=");
    Flag flag;
    try {
      flag = Flag.valueOf(flagComponents[0].replace("-", "_").toUpperCase());
    } catch (final IllegalArgumentException ex) {
      throw new IllegalArgumentException("Flag -" + flagComponents[0] + " not found", ex);
    }
    if (!(query.hasFlag(flag))) {

      query.addFlag(flag);

      // Flag has a value
      if (flagComponents.length > 1) {
        if (flag.equals(Flag.PER_PAGE)) {
          if (TypeUtils.isNumeric(flagComponents[1])) {
            query.setPerPage(Integer.parseInt(flagComponents[1]));
          } else {
            throw new IllegalArgumentException(
                "Per-page flag value must be a number. Use /prism ? for help.");
          }
        } else if (flag.equals(Flag.SHARE)) {
          for (final String sharePlayer : flagComponents[1].split(",")) {
            if (sharePlayer.equals(sender.getName())) {
              throw new IllegalArgumentException("You can't share lookup results with yourself!");
            }
            final Player shareWith = Bukkit.getServer().getPlayer(sharePlayer);
            if (shareWith != null) {
              query.addSharedPlayer(shareWith);
            } else {
              throw new IllegalArgumentException(
                  "Can't share with " + sharePlayer + ". Are they online?");
            }
          }
        }
      }
    }
  }