code: public synchronized PathMatcher addPrefixPath(final String path, final T handler) {
  		if (path.isEmpty()) {
  			throw UndertowMessages.MESSAGES.pathMustBeSpecified();
  		}
  
  		final String normalizedPath = URLUtils.normalizeSlashes(path);
  
  		if (PathMatcher.STRING_PATH_SEPARATOR.equals(normalizedPath)) {
  			if (this.defaultHandler == null) {
  				// it was null, so just use new one
  				this.defaultHandler = handler;
  			} else {
  				if (handler instanceof ResourceHandler) {
  					// new one is not a org.ops4j.pax.web.service.undertow.internal.Context, so use it
  					this.defaultHandler = handler;
  				} else {
  					// there are two default handlers which come from different (?) Contexts, so we
  					// have a collision, but let's assume user knows what (s)he's doing
  					if (this.defaultHandler != handler && !(this.defaultHandler instanceof ResourceHandler)) {
  						LOG.warn("Overwriting existing default context {} with a new one {}",
  								this.defaultHandler, handler);
  						this.defaultHandler = handler;
  					}
  				}
  			}
  			return this;
  		}
  
  		paths.put(normalizedPath, handler);
  
  		buildLengths();
  		return this;
  	}
docs: Adds a path prefix and a handler for that path. If the path does not start
  with a / then one will be prepended.
  <p>
  The match is done on a prefix bases, so registering /foo will also match /bar. Exact
  path matches are taken into account first.
  <p>
  If / is specified as the path then it will replace the default handler.
  
  @param path    The path
  @param handler The handler