You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2017/05/10 13:00:11 UTC

curator git commit: Allow the {id} in ZPaths to use any value. This is very useful for making paths easier to read and debug. So, you can now do: '/root/{org}/employee/{emp id}'

Repository: curator
Updated Branches:
  refs/heads/CURATOR-397 cba43b342 -> 49743a487


Allow the {id} in ZPaths to use any value. This is very useful for making paths easier to read and debug. So, you can now do: '/root/{org}/employee/{emp id}'


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/49743a48
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/49743a48
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/49743a48

Branch: refs/heads/CURATOR-397
Commit: 49743a487e3c159029906bb334989e6f1c82f6a8
Parents: cba43b3
Author: randgalt <ra...@apache.org>
Authored: Wed May 10 15:00:05 2017 +0200
Committer: randgalt <ra...@apache.org>
Committed: Wed May 10 15:00:05 2017 +0200

----------------------------------------------------------------------
 .../src/main/java/pubsub/Clients.java           |  6 +--
 curator-examples/src/main/java/pubsub/README.md |  2 +-
 .../curator/x/async/modeled/Resolvable.java     |  4 +-
 .../apache/curator/x/async/modeled/ZPath.java   | 56 +++++++++++++-------
 .../x/async/modeled/details/ZPathImpl.java      | 17 +++---
 .../x/async/modeled/typed/TypedModelSpec.java   |  6 +--
 .../x/async/modeled/typed/TypedModelSpec10.java |  6 +--
 .../x/async/modeled/typed/TypedModelSpec2.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec3.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec4.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec5.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec6.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec7.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec8.java  |  6 +--
 .../x/async/modeled/typed/TypedModelSpec9.java  |  6 +--
 .../modeled/typed/TypedModeledFramework.java    |  6 +--
 .../modeled/typed/TypedModeledFramework10.java  |  6 +--
 .../modeled/typed/TypedModeledFramework2.java   |  6 +--
 .../modeled/typed/TypedModeledFramework3.java   |  6 +--
 .../modeled/typed/TypedModeledFramework4.java   |  6 +--
 .../modeled/typed/TypedModeledFramework5.java   |  6 +--
 .../modeled/typed/TypedModeledFramework6.java   |  6 +--
 .../modeled/typed/TypedModeledFramework7.java   |  6 +--
 .../modeled/typed/TypedModeledFramework8.java   |  6 +--
 .../modeled/typed/TypedModeledFramework9.java   |  6 +--
 .../x/async/modeled/typed/TypedZPath.java       |  6 +--
 .../x/async/modeled/typed/TypedZPath10.java     |  6 +--
 .../x/async/modeled/typed/TypedZPath2.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath3.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath4.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath5.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath6.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath7.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath8.java      |  6 +--
 .../x/async/modeled/typed/TypedZPath9.java      |  6 +--
 .../confluence/modeled-components.confluence    |  7 +--
 .../curator/x/async/modeled/TestZPath.java      | 18 +++++--
 37 files changed, 162 insertions(+), 128 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-examples/src/main/java/pubsub/Clients.java
----------------------------------------------------------------------
diff --git a/curator-examples/src/main/java/pubsub/Clients.java b/curator-examples/src/main/java/pubsub/Clients.java
index 626b675..345c644 100644
--- a/curator-examples/src/main/java/pubsub/Clients.java
+++ b/curator-examples/src/main/java/pubsub/Clients.java
@@ -41,7 +41,7 @@ public class Clients
     public static final TypedModeledFramework2<LocationAvailable, Group, Priority> locationAvailableClient = TypedModeledFramework2.from(
         ModeledFramework.builder(),
         builder(LocationAvailable.class),
-        "/root/pubsub/messages/locations/{id}/{id}"
+        "/root/pubsub/messages/locations/{group}/{priority}"
     );
 
     /**
@@ -50,7 +50,7 @@ public class Clients
     public static final TypedModeledFramework2<UserCreated, Group, Priority> userCreatedClient = TypedModeledFramework2.from(
         ModeledFramework.builder(),
         builder(UserCreated.class),
-        "/root/pubsub//messages/users/{id}/{id}"
+        "/root/pubsub/messages/users/{group}/{priority}"
     );
 
     /**
@@ -59,7 +59,7 @@ public class Clients
     public static final TypedModeledFramework<Instance, InstanceType> instanceClient = TypedModeledFramework.from(
         ModeledFramework.builder(),
         builder(Instance.class),
-        "/root/pubsub//instances/{id}"
+        "/root/pubsub/instances/{instance-type}"
     );
 
     private static <T> ModelSpecBuilder<T> builder(Class<T> clazz)

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-examples/src/main/java/pubsub/README.md
----------------------------------------------------------------------
diff --git a/curator-examples/src/main/java/pubsub/README.md b/curator-examples/src/main/java/pubsub/README.md
index 90ccfac..a6dbc4e 100644
--- a/curator-examples/src/main/java/pubsub/README.md
+++ b/curator-examples/src/main/java/pubsub/README.md
@@ -36,7 +36,7 @@ public static final TypedModeledFramework2<LocationAvailable, Group, Priority> l
     TypedModeledFramework2.from(
         ModeledFramework.builder(),
         builder(LocationAvailable.class),
-        "/root/pubsub/messages/locations/{id}/{id}"
+        "/root/pubsub/messages/locations/{group}/{priority}"
     );
 ```
 

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java
index 7b86fed..209ffa1 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java
@@ -24,7 +24,7 @@ import java.util.List;
 public interface Resolvable
 {
     /**
-     * When creating paths, any node in the path can be set to {@link org.apache.curator.x.async.modeled.ZPath#parameterNodeName}.
+     * When creating paths, any node in the path can be set to {@link ZPath#parameter()}.
      * At runtime, the ZPath can be "resolved" by replacing these nodes with values.
      *
      * @param parameters list of replacements. Must have be the same length as the number of
@@ -37,7 +37,7 @@ public interface Resolvable
     }
 
     /**
-     * When creating paths, any node in the path can be set to {@link org.apache.curator.x.async.modeled.ZPath#parameterNodeName}.
+     * When creating paths, any node in the path can be set to {@link ZPath#parameter()}.
      * At runtime, the ZPath can be "resolved" by replacing these nodes with values.
      *
      * @param parameters list of replacements. Must have be the same length as the number of

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
index 21982a9..ba6fc21 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java
@@ -24,27 +24,36 @@ import java.util.List;
 import java.util.function.UnaryOperator;
 import java.util.regex.Pattern;
 
+import static org.apache.curator.utils.ZKPaths.PATH_SEPARATOR;
+
 /**
  * Abstracts a ZooKeeper ZNode path
  */
 public interface ZPath extends Resolvable
 {
     /**
-     * The special node name that can be used for replacements at runtime
-     * via {@link #resolved(Object...)} when passed via the various <code>from()</code> methods
+     * The root path: "/"
      */
-    String parameterNodeName = System.getProperty("curator-zpath-parameter", "");    // empty paths are illegal so it's useful for this purpose
+    ZPath root = ZPathImpl.root;
 
     /**
-     * Value that represents a parameter name when using {@link #parseWithIds(String)}. By default
-     * this is <code>{id}</code>
+     * Returns the special node name that can be used for replacements at runtime
+     * via {@link #resolved(Object...)} when passed via the various <code>from()</code> methods
      */
-    String idName = System.getProperty("curator-zpath-id-name", "{id}");
+    static String parameter()
+    {
+        return parameter("id");
+    }
 
     /**
-     * The root path: "/"
+     * Same as {@link #parameter()} but allows you to specify an alternate code/name. This name
+     * has no effect and is only for debugging purposes. When <code>toString()</code> is called
+     * on ZPaths, this code shows.
      */
-    ZPath root = ZPathImpl.root;
+    static String parameter(String name)
+    {
+        return PATH_SEPARATOR + "{" + name + "}";
+    }
 
     /**
      * Take a string path and return a ZPath
@@ -60,9 +69,9 @@ public interface ZPath extends Resolvable
 
     /**
      * Take a string path and return a ZPath. Each part of the path
-     * that is <code>{id}</code> is replaced with {@link #parameterNodeName}.
-     * E.g. <code>parseWithIds("/one/two/{id}/three/{id}")</code> is the equivalent
-     * of calling <code>ZPath.from("one", "two", parameterNodeName, "three", parameterNodeName)</code>
+     * that is <code>{XXXX}</code> is replaced with {@link #parameter()}.
+     * E.g. <code>parseWithIds("/one/two/{first}/three/{second}")</code> is the equivalent
+     * of calling <code>ZPath.from("one", "two", parameter(), "three", parameter())</code>
      *
      * @param fullPath the path to parse
      * @return ZPath
@@ -70,7 +79,18 @@ public interface ZPath extends Resolvable
      */
     static ZPath parseWithIds(String fullPath)
     {
-        return ZPathImpl.parse(fullPath, s -> s.equals(idName) ? parameterNodeName : s);
+        return ZPathImpl.parse(fullPath, s -> isId(s) ? (PATH_SEPARATOR + s) : s); // TODO
+    }
+
+    /**
+     * Return true if the given string conforms to the "{XXXX}" ID pattern
+     *
+     * @param s string to check
+     * @return true/false
+     */
+    static boolean isId(String s)
+    {
+        return s.startsWith("{") && s.endsWith("}");
     }
 
     /**
@@ -89,7 +109,7 @@ public interface ZPath extends Resolvable
     /**
      * Convert individual path names into a ZPath. E.g.
      * <code>ZPath.from("my", "full", "path")</code>. Any/all of the names can be passed as
-     * {@link #parameterNodeName} so that the path can be resolved later using
+     * {@link #parameter()} so that the path can be resolved later using
      * of the <code>resolved()</code> methods.
      *
      * @param names path names
@@ -103,7 +123,7 @@ public interface ZPath extends Resolvable
 
     /**
      * Convert individual path names into a ZPath. Any/all of the names can be passed as
-     * {@link #parameterNodeName} so that the path can be resolved later using
+     * {@link #parameter()} so that the path can be resolved later using
      * of the <code>resolved()</code> methods.
      *
      * @param names path names
@@ -119,7 +139,7 @@ public interface ZPath extends Resolvable
      * Convert individual path names into a ZPath starting at the given base. E.g.
      * if base is "/home/base" <code>ZPath.from(base, "my", "full", "path")</code>
      * would be "/home/base/my/full/path". Any/all of the names can be passed as
-     * {@link #parameterNodeName} so that the path can be resolved later using
+     * {@link #parameter()} so that the path can be resolved later using
      * of the <code>resolved()</code> methods.
      *
      * @param base base/starting path
@@ -134,7 +154,7 @@ public interface ZPath extends Resolvable
 
     /**
      * Convert individual path names into a ZPath starting at the given base. Any/all of the names can be passed as
-     * {@link #parameterNodeName} so that the path can be resolved later using
+     * {@link #parameter()} so that the path can be resolved later using
      * of the <code>resolved()</code> methods.
      *
      * @param base base/starting path
@@ -149,7 +169,7 @@ public interface ZPath extends Resolvable
 
     /**
      * <p>
-     *     When creating paths, any node in the path can be set to {@link #parameterNodeName}.
+     *     When creating paths, any node in the path can be set to {@link #parameter()}.
      *     At runtime, the ZPath can be "resolved" by replacing these nodes with values.
      * </p>
      *
@@ -171,7 +191,7 @@ public interface ZPath extends Resolvable
 
     /**
      * <p>
-     *     When creating paths, any node in the path can be set to {@link #parameterNodeName}.
+     *     When creating paths, any node in the path can be set to {@link #parameter()}.
      *     At runtime, the ZPath can be "resolved" by replacing these nodes with values.
      * </p>
      *

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
index 4250969..27d896e 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java
@@ -150,7 +150,7 @@ public class ZPathImpl implements ZPath
     {
         if ( schema == null )
         {
-            schema = Pattern.compile(buildFullPath(s -> s.equals(parameterNodeName) ? ".*" : s));
+            schema = Pattern.compile(buildFullPath(s -> isParameter(s) ? ".*" : s));
         }
         return schema;
     }
@@ -199,7 +199,7 @@ public class ZPathImpl implements ZPath
     public String toString()
     {
         return nodes.subList(1, nodes.size())
-            .stream().map(name -> name.equals(parameterNodeName) ? idName : name)
+            .stream().map(name -> isParameter(name) ? name.substring(1) : name)
             .collect(Collectors.joining(PATH_SEPARATOR, PATH_SEPARATOR, ""));
     }
 
@@ -209,11 +209,11 @@ public class ZPathImpl implements ZPath
         Iterator<Object> iterator = parameters.iterator();
         List<String> nodeNames = nodes.stream()
             .map(name -> {
-                if ( name.equals(parameterNodeName) )
+                if ( isParameter(name) )
                 {
                     if ( !iterator.hasNext() )
                     {
-                        throw new IllegalStateException(String.format("Parameter missing for [%s]", nodes.toString()));
+                        throw new IllegalStateException(String.format("Parameter missing for [%s]", toString()));
                     }
                     return NodeName.nameFrom(iterator.next());
                 }
@@ -223,6 +223,11 @@ public class ZPathImpl implements ZPath
         return new ZPathImpl(nodeNames, null);
     }
 
+    private static boolean isParameter(String name)
+    {
+        return (name.length() > 1) && name.startsWith(PATH_SEPARATOR);
+    }
+
     private ZPathImpl(List<String> nodes, String child)
     {
         ImmutableList.Builder<String> builder = ImmutableList.<String>builder().addAll(nodes);
@@ -232,7 +237,7 @@ public class ZPathImpl implements ZPath
             builder.add(child);
         }
         this.nodes = builder.build();
-        isResolved = !this.nodes.contains(parameterNodeName);
+        isResolved = this.nodes.stream().noneMatch(ZPathImpl::isParameter);
     }
 
     private void checkRootAccess()
@@ -250,7 +255,7 @@ public class ZPathImpl implements ZPath
 
     private static void validate(String nodeName)
     {
-        if ( parameterNodeName.equals(Objects.requireNonNull(nodeName, "nodeName cannot be null")) )
+        if ( isParameter(Objects.requireNonNull(nodeName, "nodeName cannot be null")) )
         {
             return;
         }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec.java
index 218cfaa..3fa9831 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec.java
@@ -76,12 +76,12 @@ public interface TypedModelSpec<M, P1>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1> TypedModelSpec<M, P1> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1> TypedModelSpec<M, P1> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath<P1> zPath = TypedZPath.from(path);
+        TypedZPath<P1> zPath = TypedZPath.from(pathWithIds);
         return p1 -> builder.withPath(zPath.resolved(p1)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec10.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec10.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec10.java
index d3241df..1b00d66 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec10.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec10.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> TypedModelSpec10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> TypedModelSpec10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath10<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> zPath = TypedZPath10.from(path);
+        TypedZPath10<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> zPath = TypedZPath10.from(pathWithIds);
         return (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec2.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec2.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec2.java
index 2fe2426..a56e139 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec2.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec2.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec2<M, P1, P2>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2> TypedModelSpec2<M, P1, P2> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2> TypedModelSpec2<M, P1, P2> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath2<P1, P2> zPath = TypedZPath2.from(path);
+        TypedZPath2<P1, P2> zPath = TypedZPath2.from(pathWithIds);
         return (p1, p2) -> builder.withPath(zPath.resolved(p1, p2)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec3.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec3.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec3.java
index 1d9466c..f4e808c 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec3.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec3.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec3<M, P1, P2, P3>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3> TypedModelSpec3<M, P1, P2, P3> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3> TypedModelSpec3<M, P1, P2, P3> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath3<P1, P2, P3> zPath = TypedZPath3.from(path);
+        TypedZPath3<P1, P2, P3> zPath = TypedZPath3.from(pathWithIds);
         return (p1, p2, p3) -> builder.withPath(zPath.resolved(p1, p2, p3)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec4.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec4.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec4.java
index ebe6e3d..040f8a6 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec4.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec4.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec4<M, P1, P2, P3, P4>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4> TypedModelSpec4<M, P1, P2, P3, P4> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4> TypedModelSpec4<M, P1, P2, P3, P4> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath4<P1, P2, P3, P4> zPath = TypedZPath4.from(path);
+        TypedZPath4<P1, P2, P3, P4> zPath = TypedZPath4.from(pathWithIds);
         return (p1, p2, p3, p4) -> builder.withPath(zPath.resolved(p1, p2, p3, p4)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec5.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec5.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec5.java
index 33a6674..b67f5b0 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec5.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec5.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec5<M, P1, P2, P3, P4, P5>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5> TypedModelSpec5<M, P1, P2, P3, P4, P5> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5> TypedModelSpec5<M, P1, P2, P3, P4, P5> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath5<P1, P2, P3, P4, P5> zPath = TypedZPath5.from(path);
+        TypedZPath5<P1, P2, P3, P4, P5> zPath = TypedZPath5.from(pathWithIds);
         return (p1, p2, p3, p4, p5) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec6.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec6.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec6.java
index 2e18426..675029a 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec6.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec6.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec6<M, P1, P2, P3, P4, P5, P6>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5, P6> TypedModelSpec6<M, P1, P2, P3, P4, P5, P6> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5, P6> TypedModelSpec6<M, P1, P2, P3, P4, P5, P6> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath6<P1, P2, P3, P4, P5, P6> zPath = TypedZPath6.from(path);
+        TypedZPath6<P1, P2, P3, P4, P5, P6> zPath = TypedZPath6.from(pathWithIds);
         return (p1, p2, p3, p4, p5, p6) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5, p6)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec7.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec7.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec7.java
index 81766f9..8ffd3c0 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec7.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec7.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec7<M, P1, P2, P3, P4, P5, P6, P7>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7> TypedModelSpec7<M, P1, P2, P3, P4, P5, P6, P7> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7> TypedModelSpec7<M, P1, P2, P3, P4, P5, P6, P7> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath7<P1, P2, P3, P4, P5, P6, P7> zPath = TypedZPath7.from(path);
+        TypedZPath7<P1, P2, P3, P4, P5, P6, P7> zPath = TypedZPath7.from(pathWithIds);
         return (p1, p2, p3, p4, p5, p6, p7) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5, p6, p7)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec8.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec8.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec8.java
index 8ab7ebd..3a9acd4 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec8.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec8.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec8<M, P1, P2, P3, P4, P5, P6, P7, P8>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8> TypedModelSpec8<M, P1, P2, P3, P4, P5, P6, P7, P8> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8> TypedModelSpec8<M, P1, P2, P3, P4, P5, P6, P7, P8> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath8<P1, P2, P3, P4, P5, P6, P7, P8> zPath = TypedZPath8.from(path);
+        TypedZPath8<P1, P2, P3, P4, P5, P6, P7, P8> zPath = TypedZPath8.from(pathWithIds);
         return (p1, p2, p3, p4, p5, p6, p7, p8) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5, p6, p7, p8)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec9.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec9.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec9.java
index 1528d37..94ff8d7 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec9.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModelSpec9.java
@@ -50,12 +50,12 @@ public interface TypedModelSpec9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9>
      * resolved path
      *
      * @param builder model spec builder
-     * @param path typed path
+     * @param pathWithIds typed path
      * @return new TypedModelSpec
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9> TypedModelSpec9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> from(ModelSpecBuilder<M> builder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9> TypedModelSpec9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> from(ModelSpecBuilder<M> builder, String pathWithIds)
     {
-        TypedZPath9<P1, P2, P3, P4, P5, P6, P7, P8, P9> zPath = TypedZPath9.from(path);
+        TypedZPath9<P1, P2, P3, P4, P5, P6, P7, P8, P9> zPath = TypedZPath9.from(pathWithIds);
         return (p1, p2, p3, p4, p5, p6, p7, p8, p9) -> builder.withPath(zPath.resolved(p1, p2, p3, p4, p5, p6, p7, p8, p9)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework.java
index 196b9b5..56a8ebc 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework.java
@@ -82,12 +82,12 @@ public interface TypedModeledFramework<M, P1>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1> TypedModeledFramework<M, P1> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1> TypedModeledFramework<M, P1> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec<M, P1> typedModelSpec = TypedModelSpec.from(modelSpecBuilder, path);
+        TypedModelSpec<M, P1> typedModelSpec = TypedModelSpec.from(modelSpecBuilder, pathWithIds);
         return (client, p1) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework10.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework10.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework10.java
index 07280b3..24a4671 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework10.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework10.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9,
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> TypedModeledFramework10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> TypedModeledFramework10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> typedModelSpec = TypedModelSpec10.from(modelSpecBuilder, path);
+        TypedModelSpec10<M, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> typedModelSpec = TypedModelSpec10.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework2.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework2.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework2.java
index 520cabc..9a535e0 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework2.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework2.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework2<M, P1, P2>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2> TypedModeledFramework2<M, P1, P2> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2> TypedModeledFramework2<M, P1, P2> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec2<M, P1, P2> typedModelSpec = TypedModelSpec2.from(modelSpecBuilder, path);
+        TypedModelSpec2<M, P1, P2> typedModelSpec = TypedModelSpec2.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework3.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework3.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework3.java
index 9a88461..6d6edc3 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework3.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework3.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework3<M, P1, P2, P3>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3> TypedModeledFramework3<M, P1, P2, P3> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3> TypedModeledFramework3<M, P1, P2, P3> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec3<M, P1, P2, P3> typedModelSpec = TypedModelSpec3.from(modelSpecBuilder, path);
+        TypedModelSpec3<M, P1, P2, P3> typedModelSpec = TypedModelSpec3.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework4.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework4.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework4.java
index 60d9db3..ff88a0f 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework4.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework4.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework4<M, P1, P2, P3, P4>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4> TypedModeledFramework4<M, P1, P2, P3, P4> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4> TypedModeledFramework4<M, P1, P2, P3, P4> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec4<M, P1, P2, P3, P4> typedModelSpec = TypedModelSpec4.from(modelSpecBuilder, path);
+        TypedModelSpec4<M, P1, P2, P3, P4> typedModelSpec = TypedModelSpec4.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework5.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework5.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework5.java
index 2281b91..7579158 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework5.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework5.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework5<M, P1, P2, P3, P4, P5>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5> TypedModeledFramework5<M, P1, P2, P3, P4, P5> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5> TypedModeledFramework5<M, P1, P2, P3, P4, P5> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec5<M, P1, P2, P3, P4, P5> typedModelSpec = TypedModelSpec5.from(modelSpecBuilder, path);
+        TypedModelSpec5<M, P1, P2, P3, P4, P5> typedModelSpec = TypedModelSpec5.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework6.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework6.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework6.java
index e97fef6..9b30a52 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework6.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework6.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework6<M, P1, P2, P3, P4, P5, P6>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5, P6> TypedModeledFramework6<M, P1, P2, P3, P4, P5, P6> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5, P6> TypedModeledFramework6<M, P1, P2, P3, P4, P5, P6> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec6<M, P1, P2, P3, P4, P5, P6> typedModelSpec = TypedModelSpec6.from(modelSpecBuilder, path);
+        TypedModelSpec6<M, P1, P2, P3, P4, P5, P6> typedModelSpec = TypedModelSpec6.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5, p6) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5, p6)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework7.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework7.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework7.java
index 7233b51..f4947f2 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework7.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework7.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework7<M, P1, P2, P3, P4, P5, P6, P7>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7> TypedModeledFramework7<M, P1, P2, P3, P4, P5, P6, P7> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7> TypedModeledFramework7<M, P1, P2, P3, P4, P5, P6, P7> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec7<M, P1, P2, P3, P4, P5, P6, P7> typedModelSpec = TypedModelSpec7.from(modelSpecBuilder, path);
+        TypedModelSpec7<M, P1, P2, P3, P4, P5, P6, P7> typedModelSpec = TypedModelSpec7.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5, p6, p7) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5, p6, p7)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework8.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework8.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework8.java
index df6a2e0..2864df1 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework8.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework8.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework8<M, P1, P2, P3, P4, P5, P6, P7, P8>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8> TypedModeledFramework8<M, P1, P2, P3, P4, P5, P6, P7, P8> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8> TypedModeledFramework8<M, P1, P2, P3, P4, P5, P6, P7, P8> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec8<M, P1, P2, P3, P4, P5, P6, P7, P8> typedModelSpec = TypedModelSpec8.from(modelSpecBuilder, path);
+        TypedModelSpec8<M, P1, P2, P3, P4, P5, P6, P7, P8> typedModelSpec = TypedModelSpec8.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5, p6, p7, p8) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5, p6, p7, p8)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework9.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework9.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework9.java
index ce56727..6102943 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework9.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedModeledFramework9.java
@@ -52,12 +52,12 @@ public interface TypedModeledFramework9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9>
      *
      * @param frameworkBuilder ModeledFrameworkBuilder
      * @param modelSpecBuilder model spec builder
-     * @param path path with {id} parameters
+     * @param pathWithIds path with {XXXX} parameters
      * @return new TypedModeledFramework
      */
-    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9> TypedModeledFramework9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String path)
+    static <M, P1, P2, P3, P4, P5, P6, P7, P8, P9> TypedModeledFramework9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> from(ModeledFrameworkBuilder<M> frameworkBuilder, ModelSpecBuilder<M> modelSpecBuilder, String pathWithIds)
     {
-        TypedModelSpec9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> typedModelSpec = TypedModelSpec9.from(modelSpecBuilder, path);
+        TypedModelSpec9<M, P1, P2, P3, P4, P5, P6, P7, P8, P9> typedModelSpec = TypedModelSpec9.from(modelSpecBuilder, pathWithIds);
         return (client, p1, p2, p3, p4, p5, p6, p7, p8, p9) -> frameworkBuilder.withClient(client).withModelSpec(typedModelSpec.resolved(p1, p2, p3, p4, p5, p6, p7, p8, p9)).build();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath.java
index 1b10767..ed3dcd3 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath.java
@@ -71,12 +71,12 @@ public interface TypedZPath<T>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T> TypedZPath<T> from(String fullPath)
+    static <T> TypedZPath<T> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath10.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath10.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath10.java
index 3d8a8e3..b29f5ef 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath10.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath10.java
@@ -31,12 +31,12 @@ public interface TypedZPath10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> TypedZPath10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> from(String fullPath)
+    static <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> TypedZPath10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath2.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath2.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath2.java
index b8e790d..1feed76 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath2.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath2.java
@@ -31,12 +31,12 @@ public interface TypedZPath2<T1, T2>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2> TypedZPath2<T1, T2> from(String fullPath)
+    static <T1, T2> TypedZPath2<T1, T2> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath3.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath3.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath3.java
index a9b54bf..91185ce 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath3.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath3.java
@@ -31,12 +31,12 @@ public interface TypedZPath3<T1, T2, T3>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3> TypedZPath3<T1, T2, T3> from(String fullPath)
+    static <T1, T2, T3> TypedZPath3<T1, T2, T3> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath4.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath4.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath4.java
index a56067d..be4905b 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath4.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath4.java
@@ -31,12 +31,12 @@ public interface TypedZPath4<T1, T2, T3, T4>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4> TypedZPath4<T1, T2, T3, T4> from(String fullPath)
+    static <T1, T2, T3, T4> TypedZPath4<T1, T2, T3, T4> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath5.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath5.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath5.java
index caa808a..8c7311d 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath5.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath5.java
@@ -31,12 +31,12 @@ public interface TypedZPath5<T1, T2, T3, T4, T5>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5> TypedZPath5<T1, T2, T3, T4, T5> from(String fullPath)
+    static <T1, T2, T3, T4, T5> TypedZPath5<T1, T2, T3, T4, T5> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath6.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath6.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath6.java
index fbe6688..6e05be9 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath6.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath6.java
@@ -31,12 +31,12 @@ public interface TypedZPath6<T1, T2, T3, T4, T5, T6>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5, T6> TypedZPath6<T1, T2, T3, T4, T5, T6> from(String fullPath)
+    static <T1, T2, T3, T4, T5, T6> TypedZPath6<T1, T2, T3, T4, T5, T6> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath7.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath7.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath7.java
index 1d13e96..a6eb4d3 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath7.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath7.java
@@ -31,12 +31,12 @@ public interface TypedZPath7<T1, T2, T3, T4, T5, T6, T7>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5, T6, T7> TypedZPath7<T1, T2, T3, T4, T5, T6, T7> from(String fullPath)
+    static <T1, T2, T3, T4, T5, T6, T7> TypedZPath7<T1, T2, T3, T4, T5, T6, T7> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath8.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath8.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath8.java
index 7918f81..68086b5 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath8.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath8.java
@@ -31,12 +31,12 @@ public interface TypedZPath8<T1, T2, T3, T4, T5, T6, T7, T8>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5, T6, T7, T8> TypedZPath8<T1, T2, T3, T4, T5, T6, T7, T8> from(String fullPath)
+    static <T1, T2, T3, T4, T5, T6, T7, T8> TypedZPath8<T1, T2, T3, T4, T5, T6, T7, T8> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath9.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath9.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath9.java
index 74706d6..e03c1f1 100644
--- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath9.java
+++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/typed/TypedZPath9.java
@@ -31,12 +31,12 @@ public interface TypedZPath9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
     /**
      * Return a TypedZPath using {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      *
-     * @param fullPath path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
+     * @param pathWithIds path to pass to {@link org.apache.curator.x.async.modeled.ZPath#parseWithIds}
      * @return TypedZPath
      */
-    static <T1, T2, T3, T4, T5, T6, T7, T8, T9> TypedZPath9<T1, T2, T3, T4, T5, T6, T7, T8, T9> from(String fullPath)
+    static <T1, T2, T3, T4, T5, T6, T7, T8, T9> TypedZPath9<T1, T2, T3, T4, T5, T6, T7, T8, T9> from(String pathWithIds)
     {
-        return from(ZPath.parseWithIds(fullPath));
+        return from(ZPath.parseWithIds(pathWithIds));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/site/confluence/modeled-components.confluence
----------------------------------------------------------------------
diff --git a/curator-x-async/src/site/confluence/modeled-components.confluence b/curator-x-async/src/site/confluence/modeled-components.confluence
index 7bcc87f..4a9f99a 100644
--- a/curator-x-async/src/site/confluence/modeled-components.confluence
+++ b/curator-x-async/src/site/confluence/modeled-components.confluence
@@ -17,11 +17,12 @@ To build a simple static path, use:
 ZPath path = ZPath.parse("/my/static/path");
 {code}
 
-To build a path with parameters, use. {{ZPath.parseWithIds()}} using the value "\{id\}" to
-denote a parameter. You can then use the {{resolve()}} method to replace the parameters. E.g.
+To build a path with parameters, use. {{ZPath.parseWithIds()}} using the value "\{XXXX\}" to
+denote a parameter. You can then use the {{resolve()}} method to replace the parameters. The value
+between "\{\}" can be any value. E.g.
 
 {code}
-ZPath path = ZPath.parseWithIds("/foo/{id}/bar/{id}");
+ZPath path = ZPath.parseWithIds("/foo/{first param}/bar/{second param}");
 
 ...
 

http://git-wip-us.apache.org/repos/asf/curator/blob/49743a48/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
----------------------------------------------------------------------
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
index 2f52238..a217b4d 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
@@ -23,7 +23,7 @@ import org.apache.curator.x.async.modeled.details.ZPathImpl;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import static org.apache.curator.x.async.modeled.ZPath.parameterNodeName;
+import static org.apache.curator.x.async.modeled.ZPath.parameter;
 
 public class TestZPath
 {
@@ -60,27 +60,27 @@ public class TestZPath
         Assert.assertEquals(ZPath.parse("/"), ZPath.root);
         Assert.assertEquals(ZPath.parse("/one/two/three"), ZPath.root.at("one").at("two").at("three"));
         Assert.assertEquals(ZPath.parse("/one/two/three"), ZPath.from("one", "two", "three"));
-        Assert.assertEquals(ZPath.parseWithIds("/one/{id}/two/{id}"), ZPath.from("one", parameterNodeName, "two", parameterNodeName));
+        Assert.assertEquals(ZPath.parseWithIds("/one/{id}/two/{id}"), ZPath.from("one", parameter(), "two", parameter()));
     }
 
     @Test(expectedExceptions = IllegalStateException.class)
     public void testUnresolvedPath()
     {
-        ZPath path = ZPath.from("one", parameterNodeName, "two");
+        ZPath path = ZPath.from("one", parameter(), "two");
         path.fullPath();
     }
 
     @Test
     public void testResolvedPath()
     {
-        ZPath path = ZPath.from("one", parameterNodeName, "two", parameterNodeName);
+        ZPath path = ZPath.from("one", parameter(), "two", parameter());
         Assert.assertEquals(path.resolved("a", "b"), ZPath.from("one", "a", "two", "b"));
     }
 
     @Test
     public void testSchema()
     {
-        ZPath path = ZPath.from("one", parameterNodeName, "two", parameterNodeName);
+        ZPath path = ZPath.from("one", parameter(), "two", parameter());
         Assert.assertEquals(path.toSchemaPathPattern().toString(), "/one/.*/two/.*");
         path = ZPath.parse("/one/two/three");
         Assert.assertEquals(path.toSchemaPathPattern().toString(), "/one/two/three");
@@ -89,4 +89,12 @@ public class TestZPath
         path = ZPath.parseWithIds("/{id}/{id}/three");
         Assert.assertEquals(path.toSchemaPathPattern().toString(), "/.*/.*/three");
     }
+
+    @Test
+    public void testCustomIds()
+    {
+        Assert.assertEquals(ZPath.parseWithIds("/a/{a}/bee/{bee}/c/{c}").toString(), "/a/{a}/bee/{bee}/c/{c}");
+        Assert.assertEquals(ZPath.from("a", parameter(), "b", parameter()).toString(), "/a/{id}/b/{id}");
+        Assert.assertEquals(ZPath.from("a", parameter("foo"), "b", parameter("bar")).toString(), "/a/{foo}/b/{bar}");
+    }
 }