/**
   * add an arena listener to this bukkit event
   *
   * @param rl RListener
   */
  @Override
  protected synchronized void addMatchListener(RListener rl) {
    if (!isListening()) {
      startListening();
    }

    Map<RListener, Integer> l = listeners.get(rl.getPriority());
    if (l == null) {
      l =
          new TreeMap<RListener, Integer>(
              new Comparator<RListener>() {
                @Override
                public int compare(RListener o1, RListener o2) {
                  return o1.getListener().equals(o2.getListener())
                      ? 0
                      : new Integer(o1.hashCode()).compareTo(o2.hashCode());
                }
              });
      listeners.put(rl.getPriority(), l);
    }

    Integer count = l.get(rl);
    if (count == null) {
      l.put(rl, 1);
      handlers = null;
      bake();
    } else {
      l.put(rl, count + 1);
    }
  }
 @Override
 public void invokeEvent(final Event event) {
   /// For each ArenaListener class that is listening
   for (RListener rl : getRegisteredListeners()) {
     try {
       rl.getMethod()
           .getMethod()
           .invoke(rl.getListener(), event); // / Invoke the listening arenalisteners method
     } catch (Exception e) {
       Log.printStackTrace(e);
     }
   }
 }
 /**
  * remove an arena listener to this bukkit event
  *
  * @param listener RListener
  * @return whether listener was found and removed
  */
 @Override
 protected boolean removeMatchListener(RListener listener) {
   final Map<RListener, Integer> map = listeners.get(listener.getPriority());
   if (map == null) return false;
   Integer count = map.get(listener);
   boolean removed;
   if (count == null || count == 1) {
     map.remove(listener);
     handlers = null;
     removed = true;
   } else {
     map.put(listener, count - 1);
     removed = false;
   }
   if (removed && !hasListeners() && isListening()) {
     stopListening();
   }
   return removed;
 }