docs: public <Value> MeasureManager wrapManager(final MeasureManager wrapped,
  			final Object measureKey) {
  		if (wrapped == null) {
  			throw new IllegalArgumentException("No manager provided");
  		} else if (measureKey != null
  				&& wrapped.getMeasureKeys().contains(measureKey)) {
  			throw new IllegalArgumentException("The key " + measureKey
  					+ " is already used by the wrapped manager " + wrapped);
  		} else {
  			MeasureManager wrapper;
  			if (measureKey != null) {
  				wrapper = new MeasureManager() {
  
  					@Override
  					public <T> PushMeasure<T> getPushMeasure(Object key) {
  						return wrapMeasure(wrapped.<T> getPushMeasure(key));
  					}
  
  					@SuppressWarnings("unchecked")
  					@Override
  					public <T> PullMeasure<T> getPullMeasure(Object key) {
  						if (key.equals(measureKey)) {
  							return (PullMeasure<T>) ListenerTimeMeasure.this;
  						} else {
  							return wrapped.<T> getPullMeasure(key);
  						}
  					}
  
  					@Override
  					public Collection<Object> getMeasureKeys() {
  						Collection<Object> keys = new LinkedList<>(
  								wrapped.getMeasureKeys());
  						keys.add(measureKey);
  						return keys;
  					}
  				};
  			} else {
  				wrapper = new MeasureManager() {
  
  					@Override
  					public <T> PushMeasure<T> getPushMeasure(Object key) {
  						return wrapMeasure(wrapped.<T> getPushMeasure(key));
  					}
  
  					@Override
  					public <T> PullMeasure<T> getPullMeasure(Object key) {
  						return wrapped.<T> getPullMeasure(key);
  					}
  
  					@Override
  					public Collection<Object> getMeasureKeys() {
  						return wrapped.getMeasureKeys();
  					}
  				};
  			}
  			return wrapper;
  		}
  	}