ListIterator<EventAndListeners<IEvent>> eventsIterator = this.eventsList.listIterator();
EventAndListeners<IEvent> existingEventAndListeners;
boolean merged = false;
while(eventsIterator.hasNext()) {
existingEventAndListeners = eventsIterator.next();
IEvent existingEvent = existingEventAndListeners.getEvent();
if(mergeCapableEvent.canMerge(existingEvent)) {
// If the new event can be merged with an existing one, do so.
IEvent mergedEvent = mergeCapableEvent.merge(existingEvent);
Set<IListener<IEvent>> existingListenersSet = existingEventAndListeners.getListenersSet();
Set<IListener<IEvent>> mergedListenersSet
= new HashSet<IListener<IEvent>>(listenersCollection.size() + existingListenersSet.size());
mergedListenersSet.addAll(existingListenersSet);
for(IListener<E> listener : listenersCollection) {