public void put(UriPattern uriPattern, T target) {
        Objects.requireNonNull(uriPattern, "uriPattern");
        Objects.requireNonNull(target, "target");
        if (bindings.containsKey(uriPattern)) {
            T boundTarget = bindings.get(uriPattern);
            log.info("Pattern '" + uriPattern + "' was already bound to target of class " + boundTarget.getClass().getName()
                             + ", and will NOT be bound to target of class " + target.getClass().getName());
        } else {
            bindings.put(uriPattern, target);
        }
    }
<p>Binds the given target to the given {@link UriPattern}. Although all bindings will eventually be evaluated by
a call to {@link BindingSet#resolve(URI)}, where matching order is significant, the order in which bindings are
added is NOT. Instead, the creation of the {@link BindingSet} in {@link #activate()} sorts the bindings in such a
way that the more strict patterns are evaluated first. See class-level commentary on {@link UriPattern} for more
on this.

@param uriPattern The URI pattern to parse and bind to the target.
@param target     The target to assign to the URI pattern.
@throws NullPointerException     If any argument is null.
@throws IllegalArgumentException If the pattern has already been bound to another target.
jdisc_core/src/main/java/com/yahoo/jdisc/application/BindingRepository.java