code: public <Value> MeasureListener<Value> wrapListener(
  			final MeasureListener<Value> wrapped) {
  		if (wrapped == null) {
  			throw new IllegalArgumentException("No listener provided");
  		} else {
  			@SuppressWarnings("unchecked")
  			MeasureListener<Value> wrapper = (MeasureListener<Value>) listenerCache
  					.get(wrapped);
  
  			if (wrapper == null) {
  				wrapper = new MeasureListener<Value>() {
  					@Override
  					public void measureGenerated(Value value) {
  						long start = System.currentTimeMillis();
  						wrapped.measureGenerated(value);
  						long stop = System.currentTimeMillis();
  						time += stop - Math.max(start, lastReset);
  					}
  				};
  				listenerCache.put(wrapped, wrapper);
  			} else {
  				// reuse existing one
  			}
  
  			return wrapper;
  		}
  	}
docs: This method wrap a {@link MeasureListener} (the wrapped) into another one
  (the wrapper). Any notification made via the wrapper will allow to
  measure how much time has been spent by the wrapped to treat this
  notification.<br/>
  <br/>
  The wrapped listener is not changed, thus it can be reused in other
  {@link PushMeasure}s that we don't want to consider. If a wrapper has
  already been made for the given wrapped, it will be returned and no new
  one will be instantiated (weak references are used to not keep in memory
  the unused wrappers).
  
  @param wrapped
  the {@link MeasureListener} to wrap
  @return the {@link MeasureListener} wrapper
  @throw {@link IllegalArgumentException} if no listener is provided