private <T extends Enum> void regsiterListener(
      EventListener<T, ?> el, Class<T> enumClass, Collection<T> events) {
    boolean found = false;

    final Set<EventListenerDescriptor> descriptorSet = getOrCreateListenerSet(enumClass);

    for (EventListenerDescriptor<T> descriptor : descriptorSet) {
      if (descriptor.getListener() == el) {
        descriptor.listenFor(events);
        found = true;

        break;
      }
    }

    if (!found) {
      descriptorSet.add(new EventListenerDescriptor<T>(el, events));
    }
  }