DoublingEventListenerDelegate (@NotNull PropertyChangeListener listener) { final Pair<Integer, DoublingEventListenerDelegate> oldPair = myMap.get(listener); if (oldPair == null) { return null; } if (oldPair.getFirst() == 1) { myMap.remove(listener); } else { myMap.put(listener, Pair.create(oldPair.getFirst() - 1, oldPair.getSecond())); } return oldPair.getSecond(); }