code: <T> boolean remove(Class<T> eventClass, Listener<T> listener) {
  		lock.readLock().lock();
  		TreeSet<ListenerReferenceHolder> set = listeners.get(eventClass);
  		if (set != null) {
  			lock.readLock().unlock();
  			lock.writeLock().lock();
  			try {
  				DefaultListenerWrapper wrapper = new DefaultListenerWrapper(listener);
  				for (ListenerReferenceHolder current : set) {
  					if (wrapper.equals(current.getListenerWrapper())) {
  						return removeListenerAndSetIfNeeded(eventClass, current, set);
  					}
  				}
  				return false;
  			} finally {
  				lock.writeLock().unlock();
  			}
  		}
  		lock.readLock().unlock();
  		return false;
  	}
docs: Removes the listener if present. It also removes the listeners set from
  the map if the set is empty.
  
  @param eventClass
  @param listener
  @return true if the listener was present and has been removed