Another big refactoring. NodeName only needs to be used internally by ZPath as 
all other resolve methods forward to it. This is cleaner.


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

Branch: refs/heads/CURATOR-397
Commit: ea47c6c990c9dab9f91fa76c074d1a4251df2f9e
Parents: c8a57d5
Author: randgalt <[email protected]>
Authored: Wed May 3 14:20:43 2017 -0500
Committer: randgalt <[email protected]>
Committed: Wed May 3 14:20:43 2017 -0500

----------------------------------------------------------------------
 .../src/main/java/modeled/PersonModelSpec.java  |  4 +--
 .../src/main/java/pubsub/SubPubTest.java        |  2 +-
 .../src/main/java/pubsub/util/Publisher.java    |  8 ++---
 .../curator/x/async/modeled/ModelSpec.java      | 32 ++++++++++++++------
 .../x/async/modeled/ModeledFramework.java       | 14 ++-------
 .../curator/x/async/modeled/NodeName.java       |  5 +++
 .../curator/x/async/modeled/Resolvable.java     | 30 ++++++++++++++++++
 .../apache/curator/x/async/modeled/ZPath.java   | 12 ++++++--
 .../modeled/cached/CachedModeledFramework.java  | 10 ++----
 .../details/CachedModeledFrameworkImpl.java     | 13 ++------
 .../x/async/modeled/details/ModelSpecImpl.java  | 17 +++++++----
 .../modeled/details/ModeledFrameworkImpl.java   | 22 ++------------
 .../x/async/modeled/details/ZPathImpl.java      |  7 +++--
 .../x/async/modeled/typed/TypedZPath.java       |  2 +-
 .../x/async/modeled/typed/TypedZPath10.java     |  2 +-
 .../x/async/modeled/typed/TypedZPath2.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath3.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath4.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath5.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath6.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath7.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath8.java      |  2 +-
 .../x/async/modeled/typed/TypedZPath9.java      |  2 +-
 23 files changed, 109 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-examples/src/main/java/modeled/PersonModelSpec.java
----------------------------------------------------------------------
diff --git a/curator-examples/src/main/java/modeled/PersonModelSpec.java 
b/curator-examples/src/main/java/modeled/PersonModelSpec.java
index 97bbe48..f90f616 100644
--- a/curator-examples/src/main/java/modeled/PersonModelSpec.java
+++ b/curator-examples/src/main/java/modeled/PersonModelSpec.java
@@ -34,13 +34,13 @@ public class PersonModelSpec
         this.client = client;
 
         JacksonModelSerializer<PersonModel> serializer = 
JacksonModelSerializer.build(PersonModel.class);
-        ZPath path = ZPath.from("example", ZPath.parameterNodeName, "path", 
ZPath.parameterNodeName);
+        ZPath path = ZPath.parseWithIds("/example/{id}/path/{id}");
         modelSpec = ModelSpec.builder(path, serializer).build();
     }
 
     public ModeledFramework<PersonModel> resolved(ContainerType containerType, 
PersonId personId)
     {
-        ModelSpec<PersonModel> resolved = null;// TODO 
modelSpec.resolved(containerType.getTypeId(), personId.getId());
+        ModelSpec<PersonModel> resolved = 
modelSpec.resolved(containerType.getTypeId(), personId.getId());
         return ModeledFramework.wrap(client, resolved);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-examples/src/main/java/pubsub/SubPubTest.java
----------------------------------------------------------------------
diff --git a/curator-examples/src/main/java/pubsub/SubPubTest.java 
b/curator-examples/src/main/java/pubsub/SubPubTest.java
index ed7b95c..d36e573 100644
--- a/curator-examples/src/main/java/pubsub/SubPubTest.java
+++ b/curator-examples/src/main/java/pubsub/SubPubTest.java
@@ -157,7 +157,7 @@ public class SubPubTest implements Closeable
             case 4:
             {
                 UserCreated userCreated = new UserCreated(nextId(), 
random(Priority.values()), random(locations), random(positions));
-                System.out.println("Publishing 1 øuserCreated");
+                System.out.println("Publishing 1 userCreated");
                 publisher.publishUserCreated(random(groups), userCreated);
                 break;
             }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-examples/src/main/java/pubsub/util/Publisher.java
----------------------------------------------------------------------
diff --git a/curator-examples/src/main/java/pubsub/util/Publisher.java 
b/curator-examples/src/main/java/pubsub/util/Publisher.java
index c7541fa..99ef9a7 100644
--- a/curator-examples/src/main/java/pubsub/util/Publisher.java
+++ b/curator-examples/src/main/java/pubsub/util/Publisher.java
@@ -37,7 +37,7 @@ public class Publisher
     {
         ModeledFramework<Instance> resolvedClient = instanceClient
             .resolved(client, instance.getType())   // this resolves to the 
parent path
-            .resolved(instance);                    // this resolves to a 
child node - uses the Instance's id because Instance extends NodeName
+            .at(instance);                          // this resolves to a 
child node - uses the Instance's id because Instance extends NodeName
         resolvedClient.set(instance).exceptionally(e -> {
             log.error("Could not publish instance: " + instance, e);
             return null;
@@ -54,7 +54,7 @@ public class Publisher
         List<CuratorOp> operations = instances.stream()
             .map(instance -> instanceClient
                 .resolved(client, instance.getType())   // this resolves to 
the parent path
-                .resolved(instance)                     // this resolves to a 
child node - uses the Instance's id because Instance extends NodeName
+                .at(instance)                           // this resolves to a 
child node - uses the Instance's id because Instance extends NodeName
                 .createOp(instance)
             )
             .collect(Collectors.toList());
@@ -112,7 +112,7 @@ public class Publisher
     {
         ModeledFramework<T> resolvedClient = typedClient
             .resolved(client, group, message.getPriority())
-            .resolved(message);
+            .at(message);
         resolvedClient.set(message).exceptionally(e -> {
             log.error("Could not publish message: " + message, e);
             return null;
@@ -124,7 +124,7 @@ public class Publisher
         List<CuratorOp> operations = messages.stream()
             .map(message -> typedClient
                     .resolved(client, group, message.getPriority()) // this 
resolves to the parent path
-                    .resolved(message)                              // this 
resolves to a child node - uses the Message's id because Message extends 
NodeName
+                    .at(message)                                    // this 
resolves to a child node - uses the Message's id because Message extends 
NodeName
                     .createOp(message)
                 )
             .collect(Collectors.toList());

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModelSpec.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModelSpec.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModelSpec.java
index 197405a..08b8be4 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModelSpec.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModelSpec.java
@@ -27,7 +27,7 @@ import org.apache.zookeeper.data.ACL;
 import java.util.List;
 import java.util.Set;
 
-public interface ModelSpec<T>
+public interface ModelSpec<T> extends Resolvable
 {
     Set<CreateOption> defaultCreateOptions = 
ImmutableSet.of(CreateOption.createParentsAsContainers, 
CreateOption.setDataIfExists);
     Set<DeleteOption> defaultDeleteOptions = 
ImmutableSet.of(DeleteOption.guaranteed);
@@ -71,7 +71,7 @@ public interface ModelSpec<T>
      * @param child child node.
      * @return new Modeled Spec instance
      */
-    ModelSpec<T> at(String child);
+    ModelSpec<T> at(Object child);
 
     /**
      * Return a new CuratorModel instance with all the same options but using 
the given path.
@@ -79,17 +79,31 @@ public interface ModelSpec<T>
      * @param path new path
      * @return new Modeled Spec instance
      */
-    ModelSpec<T> at(ZPath path);
+    ModelSpec<T> withPath(ZPath path);
 
     /**
-     * Return a new CuratorModel instance with all the same options but by 
calling <code>toString()</code>
-     * on the model or, if it implements {@link 
org.apache.curator.x.async.modeled.NodeName}, it's
-     * <code>nodeName()</code> method to generate the child node's name.
+     * Return a new CuratorModel instance with all the same options but using 
a resolved
+     * path by calling {@link 
org.apache.curator.x.async.modeled.ZPath#resolved(Object...)}
+     * using the given parameters
      *
-     * @param model model to use to generate the name
-     * @return new Modeled Spec instance
+     * @param parameters list of replacements. Must have be the same length as 
the number of
+     *                   parameter nodes in the path
+     * @return new resolved ModelSpec
+     */
+    @Override
+    ModelSpec<T> resolved(Object... parameters);
+
+    /**
+     * Return a new CuratorModel instance with all the same options but using 
a resolved
+     * path by calling {@link 
org.apache.curator.x.async.modeled.ZPath#resolved(java.util.List)}
+     * using the given parameters
+     *
+     * @param parameters list of replacements. Must have be the same length as 
the number of
+     *                   parameter nodes in the path
+     * @return new resolved ModelSpec
      */
-    ModelSpec<T> resolved(T model);
+    @Override
+    ModelSpec<T> resolved(List<Object> parameters);
 
     /**
      * Return the model's path

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java
index ed575ff..eeead3c 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledFramework.java
@@ -97,7 +97,7 @@ public interface ModeledFramework<T>
      * @param child child node.
      * @return new Modeled Curator instance
      */
-    ModeledFramework<T> at(String child);
+    ModeledFramework<T> at(Object child);
 
     /**
      * Return a Modeled Curator instance with all the same options but using 
the given path.
@@ -105,17 +105,7 @@ public interface ModeledFramework<T>
      * @param path new path
      * @return new Modeled Curator instance
      */
-    ModeledFramework<T> at(ZPath path);
-
-    /**
-     * Return a new Modeled Curator instance with all the same options but by 
calling <code>toString()</code>
-     * on the model or, if it implements {@link 
org.apache.curator.x.async.modeled.NodeName}, it's
-     * <code>nodeName()</code> method to generate the child node's name.
-     *
-     * @param model model to use to generate the name
-     * @return new Modeled Curator instance
-     */
-    ModeledFramework<T> resolved(T model);
+    ModeledFramework<T> withPath(ZPath path);
 
     /**
      * Create (or update depending on build options) a ZNode at this 
instance's path with a serialized

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/NodeName.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/NodeName.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/NodeName.java
index 7dc8340..482e268 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/NodeName.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/NodeName.java
@@ -1,5 +1,10 @@
 package org.apache.curator.x.async.modeled;
 
+/**
+ * Used by the various "resolved" methods and "at" methods.
+ * If the argument to one of these methods implements this interface,
+ * the {@link #nodeName()} method is used instead of calling 
<code>toString()</code>
+ */
 @FunctionalInterface
 public interface NodeName
 {

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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
new file mode 100644
index 0000000..a54c017
--- /dev/null
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/Resolvable.java
@@ -0,0 +1,30 @@
+package org.apache.curator.x.async.modeled;
+
+import java.util.Arrays;
+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}.
+     * 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
+     *                   parameter nodes in the path
+     * @return new resolved ZPath
+     */
+    default Object resolved(Object... parameters)
+    {
+        return resolved(Arrays.asList(parameters));
+    }
+
+    /**
+     * When creating paths, any node in the path can be set to {@link 
org.apache.curator.x.async.modeled.ZPath#parameterNodeName}.
+     * 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
+     *                   parameter nodes in the path
+     * @return new resolved ZPath
+     */
+    Object resolved(List<Object> parameters);
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 b50bd01..7f5bf84 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
@@ -28,7 +28,7 @@ import java.util.regex.Pattern;
 /**
  * Abstracts a ZooKeeper ZNode path
  */
-public interface ZPath
+public interface ZPath extends Resolvable
 {
     /**
      * The special node name that can be used for replacements at runtime
@@ -36,7 +36,11 @@ public interface ZPath
      */
     String parameterNodeName = System.getProperty("curator-zpath-parameter", 
"");    // empty paths are illegal so it's useful for this purpose
 
-    String idName = System.getProperty("curator-zpath-id-name", "{id}");    // 
empty paths are illegal so it's useful for this purpose
+    /**
+     * Value that represents a parameter name when using {@link 
#parseWithIds(String)}. By default
+     * this is <code>{id}</code>
+     */
+    String idName = System.getProperty("curator-zpath-id-name", "{id}");
 
     /**
      * Return the root path: "/"
@@ -149,6 +153,7 @@ public interface ZPath
      *                   parameter nodes in the path
      * @return new resolved ZPath
      */
+    @Override
     default ZPath resolved(Object... parameters)
     {
         return resolved(Arrays.asList(parameters));
@@ -162,6 +167,7 @@ public interface ZPath
      *                   parameter nodes in the path
      * @return new resolved ZPath
      */
+    @Override
     ZPath resolved(List<Object> parameters);
 
     /**
@@ -184,7 +190,7 @@ public interface ZPath
      * @param child child node name
      * @return ZPath
      */
-    ZPath at(String child);
+    ZPath at(Object child);
 
     /**
      * Return this ZPath's parent

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/cached/CachedModeledFramework.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/cached/CachedModeledFramework.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/cached/CachedModeledFramework.java
index a73b0c5..09ddafe 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/cached/CachedModeledFramework.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/cached/CachedModeledFramework.java
@@ -46,17 +46,11 @@ public interface CachedModeledFramework<T> extends 
ModeledFramework<T>, Closeabl
      * {@inheritDoc}
      */
     @Override
-    CachedModeledFramework<T> at(String child);
+    CachedModeledFramework<T> at(Object child);
 
     /**
      * {@inheritDoc}
      */
     @Override
-    CachedModeledFramework<T> at(ZPath path);
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    CachedModeledFramework<T> resolved(T model);
+    CachedModeledFramework<T> withPath(ZPath path);
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java
index af0c153..a88c5ca 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledFrameworkImpl.java
@@ -23,7 +23,6 @@ import org.apache.curator.framework.api.transaction.CuratorOp;
 import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
 import org.apache.curator.x.async.AsyncCuratorFramework;
 import org.apache.curator.x.async.AsyncStage;
-import org.apache.curator.x.async.api.CreateOption;
 import org.apache.curator.x.async.modeled.ModelSpec;
 import org.apache.curator.x.async.modeled.ModeledFramework;
 import org.apache.curator.x.async.modeled.ZPath;
@@ -90,21 +89,15 @@ class CachedModeledFrameworkImpl<T> implements 
CachedModeledFramework<T>
     }
 
     @Override
-    public CachedModeledFramework<T> at(String child)
+    public CachedModeledFramework<T> at(Object child)
     {
         return new CachedModeledFrameworkImpl<>(client.at(child), cache);
     }
 
     @Override
-    public CachedModeledFramework<T> at(ZPath path)
+    public CachedModeledFramework<T> withPath(ZPath path)
     {
-        return new CachedModeledFrameworkImpl<>(client.at(path), cache);
-    }
-
-    @Override
-    public CachedModeledFramework<T> resolved(T model)
-    {
-        return new CachedModeledFrameworkImpl<>(client.resolved(model), cache);
+        return new CachedModeledFrameworkImpl<>(client.withPath(path), cache);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
index 7ac7007..24abd67 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModelSpecImpl.java
@@ -28,7 +28,6 @@ import org.apache.curator.x.async.api.DeleteOption;
 import org.apache.curator.x.async.modeled.ModelSerializer;
 import org.apache.curator.x.async.modeled.ModelSpec;
 import org.apache.curator.x.async.modeled.ZPath;
-import org.apache.curator.x.async.modeled.NodeName;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.data.ACL;
 import java.util.List;
@@ -59,19 +58,25 @@ public class ModelSpecImpl<T> implements ModelSpec<T>, 
SchemaValidator
     }
 
     @Override
-    public ModelSpec<T> at(String child)
+    public ModelSpec<T> at(Object child)
     {
-        return at(path.at(child));
+        return withPath(path.at(child));
     }
 
     @Override
-    public ModelSpec<T> resolved(T model)
+    public ModelSpec<T> resolved(Object... parameters)
     {
-        return at(path.at(NodeName.nameFrom(model)));
+        return withPath(path.resolved(parameters));
     }
 
     @Override
-    public ModelSpec<T> at(ZPath newPath)
+    public ModelSpec<T> resolved(List<Object> parameters)
+    {
+        return withPath(path.resolved(parameters));
+    }
+
+    @Override
+    public ModelSpec<T> withPath(ZPath newPath)
     {
         return new ModelSpecImpl<>(newPath, serializer, createMode, aclList, 
createOptions, deleteOptions, ttl);
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java
----------------------------------------------------------------------
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java
index b3c5db8..fb8985f 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ModeledFrameworkImpl.java
@@ -218,7 +218,7 @@ public class ModeledFrameworkImpl<T> implements 
ModeledFramework<T>
     }
 
     @Override
-    public ModeledFramework<T> at(String child)
+    public ModeledFramework<T> at(Object child)
     {
         ModelSpec<T> newModelSpec = modelSpec.at(child);
         return new ModeledFrameworkImpl<>(
@@ -234,25 +234,9 @@ public class ModeledFrameworkImpl<T> implements 
ModeledFramework<T>
     }
 
     @Override
-    public ModeledFramework<T> at(ZPath path)
+    public ModeledFramework<T> withPath(ZPath path)
     {
-        ModelSpec<T> newModelSpec = modelSpec.at(path);
-        return new ModeledFrameworkImpl<>(
-            client,
-            dslClient,
-            watchableClient,
-            newModelSpec,
-            watchMode,
-            watcherFilter,
-            unhandledErrorListener,
-            resultFilter
-        );
-    }
-
-    @Override
-    public ModeledFramework<T> resolved(T model)
-    {
-        ModelSpec<T> newModelSpec = modelSpec.resolved(model);
+        ModelSpec<T> newModelSpec = modelSpec.withPath(path);
         return new ModeledFrameworkImpl<>(
             client,
             dslClient,

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 5bdbe01..3365b49 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
@@ -21,6 +21,7 @@ package org.apache.curator.x.async.modeled.details;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
+import org.apache.curator.x.async.modeled.NodeName;
 import org.apache.curator.x.async.modeled.ZPath;
 import org.apache.zookeeper.common.PathUtils;
 import java.util.Arrays;
@@ -106,9 +107,9 @@ public class ZPathImpl implements ZPath
     }
 
     @Override
-    public ZPath at(String child)
+    public ZPath at(Object child)
     {
-        return new ZPathImpl(nodes, child, parameterSuppliers);
+        return new ZPathImpl(nodes, NodeName.nameFrom(child), 
parameterSuppliers);
     }
 
     @Override
@@ -209,7 +210,7 @@ public class ZPathImpl implements ZPath
                     {
                         throw new 
IllegalStateException(String.format("Parameter missing for [%s]", 
nodes.toString()));
                     }
-                    return iterator.next().toString();
+                    return NodeName.nameFrom(iterator.next());
                 }
                 return name;
             })

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 c76f055..91e642e 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
@@ -67,6 +67,6 @@ public interface TypedZPath<T>
      */
     static <T> TypedZPath<T> from(ZPath path)
     {
-        return p1 -> path.resolved(NodeName.nameFrom(p1));
+        return path::resolved;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 b289d39..9be5aed 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
@@ -48,6 +48,6 @@ public interface TypedZPath10<T1, T2, T3, T4, T5, T6, T7, T8, 
T9, T10>
      */
     static <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> TypedZPath10<T1, T2, T3, 
T4, T5, T6, T7, T8, T9, T10> from(ZPath path)
     {
-        return (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -> 
path.resolved(NodeName.nameFrom(p1), NodeName.nameFrom(p2), 
NodeName.nameFrom(p3), NodeName.nameFrom(p4), NodeName.nameFrom(p5), 
NodeName.nameFrom(p6), NodeName.nameFrom(p7), NodeName.nameFrom(p8), 
NodeName.nameFrom(p9), NodeName.nameFrom(p10));
+        return (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -> path.resolved(p1, 
p2, p3, p4, p5, p6, p7, p8, p9, p10);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 6cd6cb3..d8646db 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
@@ -48,6 +48,6 @@ public interface TypedZPath2<T1, T2>
      */
     static <T1, T2> TypedZPath2<T1, T2> from(ZPath path)
     {
-        return (p1, p2) -> path.resolved(NodeName.nameFrom(p1), 
NodeName.nameFrom(p2));
+        return (p1, p2) -> path.resolved(p1, p2);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 507941e..a08b2b4 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
@@ -48,6 +48,6 @@ public interface TypedZPath3<T1, T2, T3>
      */
     static <T1, T2, T3> TypedZPath3<T1, T2, T3> from(ZPath path)
     {
-        return (p1, p2, p3) -> path.resolved(NodeName.nameFrom(p1), 
NodeName.nameFrom(p2), NodeName.nameFrom(p3));
+        return (p1, p2, p3) -> path.resolved(p1, p2, p3);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 1c5a71c..2ee0eb0 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
@@ -48,6 +48,6 @@ public interface TypedZPath4<T1, T2, T3, T4>
      */
     static <T1, T2, T3, T4> TypedZPath4<T1, T2, T3, T4> from(ZPath path)
     {
-        return (p1, p2, p3, p4) -> path.resolved(NodeName.nameFrom(p1), 
NodeName.nameFrom(p2), NodeName.nameFrom(p3), NodeName.nameFrom(p4));
+        return (p1, p2, p3, p4) -> path.resolved(p1, p2, p3, p4);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 e7df047..d1d99fa 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
@@ -48,6 +48,6 @@ public interface TypedZPath5<T1, T2, T3, T4, T5>
      */
     static <T1, T2, T3, T4, T5> TypedZPath5<T1, T2, T3, T4, T5> from(ZPath 
path)
     {
-        return (p1, p2, p3, p4, p5) -> path.resolved(NodeName.nameFrom(p1), 
NodeName.nameFrom(p2), NodeName.nameFrom(p3), NodeName.nameFrom(p4), 
NodeName.nameFrom(p5));
+        return (p1, p2, p3, p4, p5) -> path.resolved(p1, p2, p3, p4, p5);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 9f0e5a7..53f187d 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
@@ -48,6 +48,6 @@ public interface TypedZPath6<T1, T2, T3, T4, T5, T6>
      */
     static <T1, T2, T3, T4, T5, T6> TypedZPath6<T1, T2, T3, T4, T5, T6> 
from(ZPath path)
     {
-        return (p1, p2, p3, p4, p5, p6) -> 
path.resolved(NodeName.nameFrom(p1), NodeName.nameFrom(p2), 
NodeName.nameFrom(p3), NodeName.nameFrom(p4), NodeName.nameFrom(p5), 
NodeName.nameFrom(p6));
+        return (p1, p2, p3, p4, p5, p6) -> path.resolved(p1, p2, p3, p4, p5, 
p6);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 a4298a4..9578752 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
@@ -48,6 +48,6 @@ public interface TypedZPath7<T1, T2, T3, T4, T5, T6, T7>
      */
     static <T1, T2, T3, T4, T5, T6, T7> TypedZPath7<T1, T2, T3, T4, T5, T6, 
T7> from(ZPath path)
     {
-        return (p1, p2, p3, p4, p5, p6, p7) -> 
path.resolved(NodeName.nameFrom(p1), NodeName.nameFrom(p2), 
NodeName.nameFrom(p3), NodeName.nameFrom(p4), NodeName.nameFrom(p5), 
NodeName.nameFrom(p6), NodeName.nameFrom(p7));
+        return (p1, p2, p3, p4, p5, p6, p7) -> path.resolved(p1, p2, p3, p4, 
p5, p6, p7);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 0e774fb..0033edb 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
@@ -48,6 +48,6 @@ public interface TypedZPath8<T1, T2, T3, T4, T5, T6, T7, T8>
      */
     static <T1, T2, T3, T4, T5, T6, T7, T8> TypedZPath8<T1, T2, T3, T4, T5, 
T6, T7, T8> from(ZPath path)
     {
-        return (p1, p2, p3, p4, p5, p6, p7, p8) -> 
path.resolved(NodeName.nameFrom(p1), NodeName.nameFrom(p2), 
NodeName.nameFrom(p3), NodeName.nameFrom(p4), NodeName.nameFrom(p5), 
NodeName.nameFrom(p6), NodeName.nameFrom(p7), NodeName.nameFrom(p8));
+        return (p1, p2, p3, p4, p5, p6, p7, p8) -> path.resolved(p1, p2, p3, 
p4, p5, p6, p7, p8);
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/ea47c6c9/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 804574b..c32fd22 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
@@ -48,6 +48,6 @@ public interface TypedZPath9<T1, T2, T3, T4, T5, T6, T7, T8, 
T9>
      */
     static <T1, T2, T3, T4, T5, T6, T7, T8, T9> TypedZPath9<T1, T2, T3, T4, 
T5, T6, T7, T8, T9> from(ZPath path)
     {
-        return (p1, p2, p3, p4, p5, p6, p7, p8, p9) -> 
path.resolved(NodeName.nameFrom(p1), NodeName.nameFrom(p2), 
NodeName.nameFrom(p3), NodeName.nameFrom(p4), NodeName.nameFrom(p5), 
NodeName.nameFrom(p6), NodeName.nameFrom(p7), NodeName.nameFrom(p8), 
NodeName.nameFrom(p9));
+        return (p1, p2, p3, p4, p5, p6, p7, p8, p9) -> path.resolved(p1, p2, 
p3, p4, p5, p6, p7, p8, p9);
     }
 }

Reply via email to