From 466768821429e50e9969231f7d52b1c61562611d Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Thu, 1 Jan 2015 17:13:17 -0500
Subject: [PATCH] Adding back the Class argument varients for methods. These
 will just call the ClassInitializer varient with a default initializer. They
 are provided mostly for convience.

Change-Id: I2e3b132f53f11bfe82a2280ff5f956040a131716
---
 .../syncleus/ferma/AbstractVertexFrame.java   |  40 ++++
 .../ferma/AbstractVertexTraversal.java        |  14 +-
 .../syncleus/ferma/DelegatingFramedGraph.java | 176 +++++-------------
 .../java/com/syncleus/ferma/EdgeFrame.java    |   2 -
 .../java/com/syncleus/ferma/FramedGraph.java  |  74 +++++++-
 .../syncleus/ferma/GlobalVertexTraversal.java |  10 +
 .../java/com/syncleus/ferma/VertexFrame.java  | 130 ++++++++++++-
 .../com/syncleus/ferma/VertexTraversal.java   |  26 +++
 .../com/syncleus/ferma/FramedGraphTest.java   | 130 +++++++++++++
 .../com/syncleus/ferma/FramedVertexTest.java  | 144 +++++++-------
 .../ferma/SimpleTypeResolverTest.java         |   2 +-
 11 files changed, 525 insertions(+), 223 deletions(-)

diff --git a/src/main/java/com/syncleus/ferma/AbstractVertexFrame.java b/src/main/java/com/syncleus/ferma/AbstractVertexFrame.java
index 31133f35..26f4fe27 100644
--- a/src/main/java/com/syncleus/ferma/AbstractVertexFrame.java
+++ b/src/main/java/com/syncleus/ferma/AbstractVertexFrame.java
@@ -50,6 +50,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         final T framedEdge = getGraph().frameNewElement(edge, initializer);
         return framedEdge;
     }
+    
+    @Override
+    public <T> T addFramedEdge(final String label, final VertexFrame inVertex, final Class<T> kind) {
+        return this.addFramedEdge(label, inVertex, new DefaultClassInitializer<>(kind));
+    }
 
     @Override
     public <T> T addFramedEdgeExplicit(final String label, final VertexFrame inVertex, final ClassInitializer<T> initializer) {
@@ -58,6 +63,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         final T framedEdge = getGraph().frameNewElementExplicit(edge, initializer);
         return framedEdge;
     }
+    
+    @Override
+    public <T> T addFramedEdgeExplicit(final String label, final VertexFrame inVertex, final Class<T> kind) {
+        return this.addFramedEdgeExplicit(label, inVertex, new DefaultClassInitializer<>(kind));
+    }
 
     @Override
     public TEdge addFramedEdge(final String label, final VertexFrame inVertex) {
@@ -198,6 +208,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkOut((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkOut(final Class<K> kind, final String... labels) {
+        return this.setLinkOut(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public <K> K setLinkOutExplicit(final ClassInitializer<K> initializer, final String... labels) {
@@ -205,6 +220,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkOut((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkOutExplicit(final Class<K> kind, final String... labels) {
+        return this.setLinkOutExplicit(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public <K> K setLinkIn(final ClassInitializer<K> initializer, final String... labels) {
@@ -212,6 +232,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkIn((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkIn(final Class<K> kind, final String... labels) {
+        return this.setLinkIn(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public <K> K setLinkInExplicit(final ClassInitializer<K> initializer, final String... labels) {
@@ -219,6 +244,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkIn((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkInExplicit(final Class<K> kind, final String... labels) {
+        return this.setLinkInExplicit(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public <K> K setLinkBoth(final ClassInitializer<K> initializer, final String... labels) {
@@ -226,6 +256,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkBoth((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkBoth(final Class<K> kind, final String... labels) {
+        return this.setLinkBoth(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public <K> K setLinkBothExplicit(final ClassInitializer<K> initializer, final String... labels) {
@@ -233,6 +268,11 @@ public abstract class AbstractVertexFrame extends AbstractElementFrame implement
         setLinkBoth((VertexFrame) vertex, labels);
         return vertex;
     }
+    
+    @Override
+    public <K> K setLinkBothExplicit(final Class<K> kind, final String... labels) {
+        return this.setLinkBothExplicit(new DefaultClassInitializer<>(kind), labels);
+    }
 
     @Override
     public VertexTraversal<?, ?, ?> traversal() {
diff --git a/src/main/java/com/syncleus/ferma/AbstractVertexTraversal.java b/src/main/java/com/syncleus/ferma/AbstractVertexTraversal.java
index 9002aebd..fde022fe 100644
--- a/src/main/java/com/syncleus/ferma/AbstractVertexTraversal.java
+++ b/src/main/java/com/syncleus/ferma/AbstractVertexTraversal.java
@@ -63,7 +63,7 @@ abstract class AbstractVertexTraversal<C, S, M> extends AbstractTraversal<Vertex
     @Override
     public VertexFrame nextOrAdd() {
 
-        return nextOrAdd(VertexFrame.DEFAULT_INITIALIZER);
+        return nextOrAdd(TVertex.DEFAULT_INITIALIZER);
     }
 
     @Override
@@ -433,7 +433,11 @@ abstract class AbstractVertexTraversal<C, S, M> extends AbstractTraversal<Vertex
         catch (final NoSuchElementException e) {
             return graph().addFramedVertex(initializer);
         }
-
+    }
+    
+    @Override
+    public <N> N nextOrAdd(final Class<N> kind) {
+        return this.nextOrAdd(new DefaultClassInitializer<>(kind));
     }
 
     @Override
@@ -444,7 +448,11 @@ abstract class AbstractVertexTraversal<C, S, M> extends AbstractTraversal<Vertex
         catch (final NoSuchElementException e) {
             return graph().addFramedVertex(initializer);
         }
-
+    }
+    
+    @Override
+    public <N> N nextOrAddExplicit(final Class<N> kind) {
+        return this.nextOrAddExplicit(new DefaultClassInitializer<>(kind));
     }
 
     @Override
diff --git a/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java b/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
index 3df3656a..4c207fd4 100644
--- a/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
+++ b/src/main/java/com/syncleus/ferma/DelegatingFramedGraph.java
@@ -236,6 +236,11 @@ public class DelegatingFramedGraph implements FramedGraph {
         initializer.initalize(frame);
         return frame;
     }
+    
+    @Override
+    public <T> T frameNewElement(final Element e, final Class<T> kind) {
+        return this.frameNewElement(e, new DefaultClassInitializer<>(kind));
+    }
 
     @Override
     public <T> Iterator<? extends T> frame(final Iterator<? extends Element> pipeline, final Class<T> kind) {
@@ -262,169 +267,104 @@ public class DelegatingFramedGraph implements FramedGraph {
     }
 
     @Override
-    public <T> T frameNewElementExplicit(final Element e, final ClassInitializer<T> kind) {
-        final T frame = frameElement(e, kind.getInitializationType());
-        this.untypedResolver.init(e, kind.getInitializationType());
+    public <T> T frameNewElementExplicit(final Element e, final ClassInitializer<T> initializer) {
+        final T frame = frameElement(e, initializer.getInitializationType());
+        this.untypedResolver.init(e, initializer.getInitializationType());
         ((AbstractElementFrame) frame).init();
-        kind.initalize(frame);
+        initializer.initalize(frame);
         return frame;
     }
+    
+    @Override
+    public <T> T frameNewElementExplicit(final Element e, final Class<T> kind) {
+        return this.frameNewElementExplicit(e, new DefaultClassInitializer<>(kind));
+    }
 
     @Override
-    public <T> Iterator<? extends T> frameExplicit(final Iterator<? extends Element> pipeline, final ClassInitializer<T> kind) {
+    public <T> Iterator<? extends T> frameExplicit(final Iterator<? extends Element> pipeline, final Class<T> kind) {
         return Iterators.transform(pipeline, new Function<Element, T>() {
 
             @Override
             public T apply(final Element input) {
-                return frameElementExplicit(input, kind.getInitializationType());
+                return frameElementExplicit(input, kind);
             }
 
         });
     }
 
-    /**
-     * Add a vertex to the graph
-     *
-     * @param <T> The type used to frame the element.
-     * @param kind
-     *            The kind of the frame.
-     * @return The framed vertex.
-     */
     @Override
-    public <T> T addFramedVertex(final ClassInitializer<T> kind) {
-        final T framedVertex = frameNewElement(delegate.addVertex(null), kind);
+    public <T> T addFramedVertex(final ClassInitializer<T> initializer) {
+        final T framedVertex = frameNewElement(delegate.addVertex(null), initializer);
         return framedVertex;
     }
+    
+    @Override
+    public <T> T addFramedVertex(final Class<T> kind) {
+        return this.addFramedVertex(new DefaultClassInitializer<>(kind));
+    }
 
-    /**
-     * Add a vertex to the graph
-     *
-     * This will bypass the default type resolution and use the untyped resolver
-     * instead. This method is useful for speeding up a look up when type resolution
-     * isn't required.
-     *
-     * @param <T> The type used to frame the element.
-     * @param kind
-     *            The kind of the frame.
-     * @return The framed vertex.
-     */
     @Override
-    public <T> T addFramedVertexExplicit(final ClassInitializer<T> kind) {
-        final T framedVertex = frameNewElementExplicit(delegate.addVertex(null), kind);
+    public <T> T addFramedVertexExplicit(final ClassInitializer<T> initializer) {
+        final T framedVertex = frameNewElementExplicit(delegate.addVertex(null), initializer);
         return framedVertex;
     }
+    
+    @Override
+    public <T> T addFramedVertexExplicit(final Class<T> kind) {
+        return this.addFramedVertexExplicit(new DefaultClassInitializer<>(kind));
+    }
 
-    /**
-     * Add a vertex to the graph using a frame type of {@link TVertex}.
-     *
-     * @return The framed vertex.
-     */
     @Override
     public TVertex addFramedVertex() {
 
         return addFramedVertex(TVertex.DEFAULT_INITIALIZER);
     }
 
-    /**
-     * Add a vertex to the graph using a frame type of {@link TVertex}.
-     *
-     * This will bypass the default type resolution and use the untyped resolver
-     * instead. This method is useful for speeding up a look up when type resolution
-     * isn't required.
-     *
-     * @return The framed vertex.
-     */
     @Override
     public TVertex addFramedVertexExplicit() {
 
         return addFramedVertexExplicit(TVertex.DEFAULT_INITIALIZER);
     }
 
-    /**
-     * Add a edge to the graph
-     *
-     * @param <T> The type used to frame the element.
-     * @param source The source vertex
-     * @param destination The destination vertex
-     * @param label The label for the edge
-     * @param kind
-     *            The kind of the frame.
-     * @return The framed edge.
-     */
     @Override
-    public <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, final ClassInitializer<T> kind) {
-        final T framedEdge = frameNewElement(this.delegate.addEdge(null, source.getElement(), destination.getElement(), label), kind);
+    public <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, final ClassInitializer<T> initializer) {
+        final T framedEdge = frameNewElement(this.delegate.addEdge(null, source.getElement(), destination.getElement(), label), initializer);
         return framedEdge;
     }
+    
+    @Override
+    public <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, final Class<T> kind) {
+        return this.addFramedEdge(source, destination, label, new DefaultClassInitializer<>(kind));
+    }
 
-    /**
-     * Add a edge to the graph
-     *
-     * This will bypass the default type resolution and use the untyped resolver
-     * instead. This method is useful for speeding up a look up when type resolution
-     * isn't required.
-     *
-     * @param <T> The type used to frame the element.
-     * @param source The source vertex
-     * @param destination The destination vertex
-     * @param label The label for the edge
-     * @param kind
-     *            The kind of the frame.
-     * @return The framed edge.
-     */
     @Override
-    public <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, final ClassInitializer<T> kind) {
-        final T framedEdge = frameNewElementExplicit(this.delegate.addEdge(null, source.getElement(), destination.getElement(), label), kind);
+    public <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, final ClassInitializer<T> initializer) {
+        final T framedEdge = frameNewElementExplicit(this.delegate.addEdge(null, source.getElement(), destination.getElement(), label), initializer);
         return framedEdge;
     }
+    
+    @Override
+    public <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, final Class<T> kind) {
+        return this.addFramedEdgeExplicit(source, destination, label, new DefaultClassInitializer<>(kind));
+    }
 
-    /**
-     * Add a edge to the graph using a frame type of {@link TEdge}.
-     *
-     * @param source The source vertex
-     * @param destination The destination vertex
-     * @param label The label for the edge
-     * @return The framed edge.
-     */
     @Override
     public TEdge addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label) {
 
         return addFramedEdge(source, destination, label, TEdge.DEFAULT_INITIALIZER);
     }
 
-    /**
-     * Add a edge to the graph using a frame type of {@link TEdge}.
-     *
-     * This will bypass the default type resolution and use the untyped resolver
-     * instead. This method is useful for speeding up a look up when type resolution
-     * isn't required.
-     *
-     * @param source The source vertex
-     * @param destination The destination vertex
-     * @param label The label for the edge
-     * @return The framed edge.
-     */
     @Override
     public TEdge addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label) {
 
         return addFramedEdgeExplicit(source, destination, label, TEdge.DEFAULT_INITIALIZER);
     }
 
-    /**
-     * Query over all vertices in the graph.
-     *
-     * @return The query.
-     */
     @Override
     public VertexTraversal<?, ?, ?> v() {
         return new GlobalVertexTraversal(this, delegate);
     }
 
-    /**
-     * Query over all edges in the graph.
-     *
-     * @return The query.
-     */
     @Override
     public EdgeTraversal<?, ?, ?> e() {
         return new SimpleTraversal(this, delegate).e();
@@ -470,13 +410,6 @@ public class DelegatingFramedGraph implements FramedGraph {
         return new FramingEdgeIterable<>(this, this.getEdges(key, value), kind, true);
     }
 
-    /**
-     * Query over a list of vertices in the graph.
-     *
-     * @param ids
-     *            The ids of the vertices.
-     * @return The query.
-     */
     @Override
     public VertexTraversal<?, ?, ?> v(final Collection<?> ids) {
         return new SimpleTraversal(this, Iterators.transform(ids.iterator(), new Function<Object, Vertex>() {
@@ -489,13 +422,6 @@ public class DelegatingFramedGraph implements FramedGraph {
         })).castToVertices();
     }
 
-    /**
-     * Query over a list of vertices in the graph.
-     *
-     * @param ids
-     *            The ids of the vertices.
-     * @return The query.
-     */
     @Override
     public VertexTraversal<?, ?, ?> v(final Object... ids) {
         return new SimpleTraversal(this, Iterators.transform(Iterators.forArray(ids), new Function<Object, Vertex>() {
@@ -508,13 +434,6 @@ public class DelegatingFramedGraph implements FramedGraph {
         })).castToVertices();
     }
 
-    /**
-     * Query over a list of edges in the graph.
-     *
-     * @param ids
-     *            The ids of the edges.
-     * @return The query.
-     */
     @Override
     public EdgeTraversal<?, ?, ?> e(final Object... ids) {
         return new SimpleTraversal(this, Iterators.transform(Iterators.forArray(ids), new Function<Object, Edge>() {
@@ -527,13 +446,6 @@ public class DelegatingFramedGraph implements FramedGraph {
         })).castToEdges();
     }
 
-    /**
-     * Query over a list of edges in the graph.
-     *
-     * @param ids
-     *            The ids of the edges.
-     * @return The query.
-     */
     @Override
     public EdgeTraversal<?, ?, ?> e(final Collection<?> ids) {
         return new SimpleTraversal(this, Iterators.transform(ids.iterator(), new Function<Object, Edge>() {
diff --git a/src/main/java/com/syncleus/ferma/EdgeFrame.java b/src/main/java/com/syncleus/ferma/EdgeFrame.java
index 59710f8e..1fa79c89 100644
--- a/src/main/java/com/syncleus/ferma/EdgeFrame.java
+++ b/src/main/java/com/syncleus/ferma/EdgeFrame.java
@@ -22,8 +22,6 @@ import com.google.gson.JsonObject;
 import com.tinkerpop.blueprints.Edge;
 
 public interface EdgeFrame extends ElementFrame {
-    static final ClassInitializer<EdgeFrame> DEFAULT_INITIALIZER = new DefaultClassInitializer(EdgeFrame.class);
-
     @Override
     Edge getElement();
 
diff --git a/src/main/java/com/syncleus/ferma/FramedGraph.java b/src/main/java/com/syncleus/ferma/FramedGraph.java
index e97db7e9..676a058b 100644
--- a/src/main/java/com/syncleus/ferma/FramedGraph.java
+++ b/src/main/java/com/syncleus/ferma/FramedGraph.java
@@ -35,6 +35,16 @@ public interface FramedGraph extends Graph {
      */
     void close();
 
+    /**
+     * Add a vertex to the graph
+     *
+     * @param <T> The type used to frame the element.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The framed vertex.
+     */
+    <T> T addFramedVertex(ClassInitializer<T> initializer);
+    
     /**
      * Add a vertex to the graph
      *
@@ -43,8 +53,22 @@ public interface FramedGraph extends Graph {
      *            The kind of the frame.
      * @return The framed vertex.
      */
-    <T> T addFramedVertex(ClassInitializer<T> kind);
+    <T> T addFramedVertex(Class<T> kind);
 
+    /**
+     * Add a vertex to the graph
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <T> The type used to frame the element.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The framed vertex.
+     */
+    <T> T addFramedVertexExplicit(ClassInitializer<T> initializer);
+    
     /**
      * Add a vertex to the graph
      *
@@ -57,7 +81,7 @@ public interface FramedGraph extends Graph {
      *            The kind of the frame.
      * @return The framed vertex.
      */
-    <T> T addFramedVertexExplicit(ClassInitializer<T> kind);
+    <T> T addFramedVertexExplicit(Class<T> kind);
 
     /**
      * Add a vertex to the graph using a frame type of {@link TVertex}.
@@ -77,6 +101,19 @@ public interface FramedGraph extends Graph {
      */
     TVertex addFramedVertexExplicit();
 
+    /**
+     * Add a edge to the graph
+     *
+     * @param <T> The type used to frame the element.
+     * @param source The source vertex
+     * @param destination the destination vertex
+     * @param label the label.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The framed edge.
+     */
+    <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, ClassInitializer<T> initializer);
+    
     /**
      * Add a edge to the graph
      *
@@ -88,8 +125,25 @@ public interface FramedGraph extends Graph {
      *            The kind of the frame.
      * @return The framed edge.
      */
-    <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, ClassInitializer<T> kind);
+    <T> T addFramedEdge(final VertexFrame source, final VertexFrame destination, final String label, Class<T> kind);
 
+    /**
+     * Add a edge to the graph
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <T> The type used to frame the element.
+     * @param source The source vertex
+     * @param destination the destination vertex
+     * @param label the label.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The framed edge.
+     */
+    <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, ClassInitializer<T> initializer);
+    
     /**
      * Add a edge to the graph
      *
@@ -105,7 +159,7 @@ public interface FramedGraph extends Graph {
      *            The kind of the frame.
      * @return The framed edge.
      */
-    <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, ClassInitializer<T> kind);
+    <T> T addFramedEdgeExplicit(final VertexFrame source, final VertexFrame destination, final String label, Class<T> kind);
 
     /**
      * Add a edge to the graph using a frame type of {@link TEdge}.
@@ -203,13 +257,17 @@ public interface FramedGraph extends Graph {
 
     <T> Iterator<? extends T> frame(Iterator<? extends Element> pipeline, final Class<T> kind);
 
-    <T> T frameNewElement(Element e, ClassInitializer<T> kind);
+    <T> T frameNewElement(Element e, ClassInitializer<T> initializer);
+    
+    <T> T frameNewElement(Element e, Class<T> kind);
 
-    <T> T frameElement(Element e, Class<T> initializer);
+    <T> T frameElement(Element e, Class<T> kind);
 
-    <T> T frameNewElementExplicit(Element e, ClassInitializer<T> kind);
+    <T> T frameNewElementExplicit(Element e, ClassInitializer<T> initializer);
+    
+    <T> T frameNewElementExplicit(Element e, Class<T> kind);
 
     <T> T frameElementExplicit(Element e, Class<T> kind);
 
-    <T> Iterator<? extends T> frameExplicit(Iterator<? extends Element> pipeline, final ClassInitializer<T> kind);
+    <T> Iterator<? extends T> frameExplicit(Iterator<? extends Element> pipeline, final Class<T> kind);
 }
diff --git a/src/main/java/com/syncleus/ferma/GlobalVertexTraversal.java b/src/main/java/com/syncleus/ferma/GlobalVertexTraversal.java
index a29533f9..212a06ff 100644
--- a/src/main/java/com/syncleus/ferma/GlobalVertexTraversal.java
+++ b/src/main/java/com/syncleus/ferma/GlobalVertexTraversal.java
@@ -297,11 +297,21 @@ public class GlobalVertexTraversal<C, S, M> implements VertexTraversal<C, S, M>
     public <N> N nextOrAddExplicit(final ClassInitializer<N> initializer) {
         return this.simpleDelegate().nextOrAddExplicit(initializer);
     }
+    
+    @Override
+    public <N> N nextOrAddExplicit(final Class<N> kind) {
+        return this.nextOrAddExplicit(new DefaultClassInitializer<>(kind));
+    }
 
     @Override
     public <N> N nextOrAdd(final ClassInitializer<N> initializer) {
         return this.delegate().nextOrAdd(initializer);
     }
+    
+    @Override
+    public <N> N nextOrAdd(final Class<N> kind) {
+        return this.nextOrAdd(new DefaultClassInitializer<>(kind));
+    }
 
     @Override
     public <N> List<? extends N> next(final int amount, final Class<N> kind) {
diff --git a/src/main/java/com/syncleus/ferma/VertexFrame.java b/src/main/java/com/syncleus/ferma/VertexFrame.java
index 1d75ff98..0ecf30d6 100644
--- a/src/main/java/com/syncleus/ferma/VertexFrame.java
+++ b/src/main/java/com/syncleus/ferma/VertexFrame.java
@@ -21,12 +21,24 @@ package com.syncleus.ferma;
 import com.google.gson.JsonObject;
 import com.tinkerpop.blueprints.Vertex;
 
-public interface VertexFrame extends ElementFrame {
-    static final ClassInitializer<VertexFrame> DEFAULT_INITIALIZER = new DefaultClassInitializer(VertexFrame.class);
-    
+public interface VertexFrame extends ElementFrame {    
     @Override
     Vertex getElement();
 
+    /**
+     * Add an edge using the supplied frame type.
+     *
+     * @param <T> The type for the framed edge.
+     * @param label
+     *            The label for the edge
+     * @param inVertex
+     *            The vertex to link to.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The new edge.
+     */
+    <T> T addFramedEdge(String label, VertexFrame inVertex, ClassInitializer<T> initializer);
+    
     /**
      * Add an edge using the supplied frame type.
      *
@@ -39,8 +51,26 @@ public interface VertexFrame extends ElementFrame {
      *            The kind of frame.
      * @return The new edge.
      */
-    <T> T addFramedEdge(String label, VertexFrame inVertex, ClassInitializer<T> kind);
+    <T> T addFramedEdge(String label, VertexFrame inVertex, Class<T> kind);
 
+    /**
+     * Add an edge using the supplied frame type.
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <T> The type for the framed edge.
+     * @param label
+     *            The label for the edge
+     * @param inVertex
+     *            The vertex to link to.
+     * @param initializer
+     *            the initializer for the frame which defines its type and may initialize properties
+     * @return The new edge.
+     */
+    <T> T addFramedEdgeExplicit(String label, VertexFrame inVertex, ClassInitializer<T> initializer);
+    
     /**
      * Add an edge using the supplied frame type.
      *
@@ -57,7 +87,7 @@ public interface VertexFrame extends ElementFrame {
      *            The kind of frame.
      * @return The new edge.
      */
-    <T> T addFramedEdgeExplicit(String label, VertexFrame inVertex, ClassInitializer<T> kind);
+    <T> T addFramedEdgeExplicit(String label, VertexFrame inVertex, Class<T> kind);
 
     /**
      * Add an edge using a frame type of {@link TEdge}.
@@ -217,6 +247,19 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkOut(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all out edges with the labels and then add a single edge to a new
+     * vertex.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkOut(Class<K> kind, String... labels);
 
     /**
      * Remove all out edges with the labels and then add a single edge to a new
@@ -234,6 +277,23 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkOutExplicit(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all out edges with the labels and then add a single edge to a new
+     * vertex.
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkOutExplicit(Class<K> kind, String... labels);
 
     /**
      * Remove all in edges with the labels and then add a single edge from a
@@ -247,6 +307,19 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkIn(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all in edges with the labels and then add a single edge from a
+     * new vertex.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkIn(Class<K> kind, String... labels);
 
     /**
      * Remove all in edges with the labels and then add a single edge from a
@@ -264,6 +337,23 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkInExplicit(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all in edges with the labels and then add a single edge from a
+     * new vertex.
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkInExplicit(Class<K> kind, String... labels);
 
     /**
      * Remove all edges with the labels and then add edges to/from a new
@@ -277,6 +367,19 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkBoth(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all edges with the labels and then add edges to/from a new
+     * vertex.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkBoth(Class<K> kind, String... labels);
 
     /**
      * Remove all edges with the labels and then add edges to/from a new
@@ -294,6 +397,23 @@ public interface VertexFrame extends ElementFrame {
      * @return The newly created edge.
      */
     <K> K setLinkBothExplicit(ClassInitializer<K> initializer, String... labels);
+    
+    /**
+     * Remove all edges with the labels and then add edges to/from a new
+     * vertex.
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     *
+     * @param <K> The type used to frame the edge.
+     * @param kind
+     *            The kind of frame.
+     * @param labels
+     *            The labels of the edges.
+     * @return The newly created edge.
+     */
+    <K> K setLinkBothExplicit(Class<K> kind, String... labels);
 
     /**
      * Shortcut to get frame Traversal of current element
diff --git a/src/main/java/com/syncleus/ferma/VertexTraversal.java b/src/main/java/com/syncleus/ferma/VertexTraversal.java
index 561274dc..3a46dc64 100644
--- a/src/main/java/com/syncleus/ferma/VertexTraversal.java
+++ b/src/main/java/com/syncleus/ferma/VertexTraversal.java
@@ -336,6 +336,21 @@ public interface VertexTraversal<C, S, M> extends Traversal<VertexFrame, C, S, M
      * @return the next emitted object
      */
     <N> N nextOrAddExplicit(ClassInitializer<N> initializer);
+    
+    /**
+     * Get the next object emitted from the pipeline. If no such object exists a
+     * new vertex is created.
+     *
+     * This will bypass the default type resolution and use the untyped resolver
+     * instead. This method is useful for speeding up a look up when type resolution
+     * isn't required.
+     * 
+     * @param <N> The type used to frame the element
+     * @param kind
+     *            The kind of frame.
+     * @return the next emitted object
+     */
+    <N> N nextOrAddExplicit(Class<N> kind);
 
     /**
      * Get the next object emitted from the pipeline. If no such object exists a
@@ -347,6 +362,17 @@ public interface VertexTraversal<C, S, M> extends Traversal<VertexFrame, C, S, M
      * @return the next emitted object
      */
     <N> N nextOrAdd(ClassInitializer<N> initializer);
+    
+    /**
+     * Get the next object emitted from the pipeline. If no such object exists a
+     * new vertex is created.
+     *
+     * @param <N> The type used to frame the element
+     * @param kind
+     *            The kind of frame.
+     * @return the next emitted object
+     */
+    <N> N nextOrAdd(Class<N> kind);
 
     /**
      * Return the next X objects in the traversal as a list.
diff --git a/src/test/java/com/syncleus/ferma/FramedGraphTest.java b/src/test/java/com/syncleus/ferma/FramedGraphTest.java
index 3f741817..a99f2303 100644
--- a/src/test/java/com/syncleus/ferma/FramedGraphTest.java
+++ b/src/test/java/com/syncleus/ferma/FramedGraphTest.java
@@ -57,6 +57,28 @@ public class FramedGraphTest {
         final Person bryn = fg.v().has("name", "Bryn").next(Person.class);
 
 
+        Assert.assertEquals("Bryn", bryn.getName());
+        Assert.assertEquals(15, bryn.getKnowsList().get(0).getYears());
+
+        final Collection<? extends Integer> knowsCollection = fg.v().has("name", "Julia").bothE().property("years", Integer.class).aggregate().cap();
+        Assert.assertEquals(1, knowsCollection.size());
+    }
+    
+    @Test
+    public void testSanityByClass() {
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g);
+        final Person p1 = fg.addFramedVertex(Person.class);
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertex(Person.class);
+        p2.setName("Julia");
+        final Knows knows = p1.addKnows(p2);
+        knows.setYears(15);
+
+        final Person bryn = fg.v().has("name", "Bryn").next(Person.class);
+
+
         Assert.assertEquals("Bryn", bryn.getName());
         Assert.assertEquals(15, bryn.getKnowsList().get(0).getYears());
 
@@ -79,6 +101,28 @@ public class FramedGraphTest {
         final Person bryn = fg.v().has("name", "Bryn").nextExplicit(Person.class);
 
 
+        Assert.assertEquals("Bryn", bryn.getName());
+        Assert.assertEquals(15, bryn.getKnowsListExplicit().get(0).getYears());
+
+        final Collection<? extends Integer> knowsCollection = fg.v().has("name", "Julia").bothE().property("years", Integer.class).aggregate().cap();
+        Assert.assertEquals(1, knowsCollection.size());
+    }
+    
+    @Test
+    public void testSanityExplicitByClass() {
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g);
+        final Person p1 = fg.addFramedVertexExplicit(Person.class);
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertexExplicit(Person.class);
+        p2.setName("Julia");
+        final Knows knows = p1.addKnowsExplicit(p2);
+        knows.setYears(15);
+
+        final Person bryn = fg.v().has("name", "Bryn").nextExplicit(Person.class);
+
+
         Assert.assertEquals("Bryn", bryn.getName());
         Assert.assertEquals(15, bryn.getKnowsListExplicit().get(0).getYears());
 
@@ -103,6 +147,24 @@ public class FramedGraphTest {
         Assert.assertEquals(Programmer.class, bryn.getClass());
         Assert.assertEquals(Person.class, julia.getClass());
     }
+    
+    @Test
+    public void testJavaTypingByClass() {
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+
+        final Person p1 = fg.addFramedVertex(Programmer.class);
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertex(Person.class);
+        p2.setName("Julia");
+
+        final Person bryn = fg.v().has("name", "Bryn").next(Person.class);
+        final Person julia = fg.v().has("name", "Julia").next(Person.class);
+
+        Assert.assertEquals(Programmer.class, bryn.getClass());
+        Assert.assertEquals(Person.class, julia.getClass());
+    }
 
     @Test
     public void testJavaTypingAddExplicit() {
@@ -121,6 +183,24 @@ public class FramedGraphTest {
         Assert.assertEquals(Person.class, bryn.getClass());
         Assert.assertEquals(Person.class, julia.getClass());
     }
+    
+    @Test
+    public void testJavaTypingAddExplicitByClass() {
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+
+        final Person p1 = fg.addFramedVertexExplicit(Programmer.class);
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertexExplicit(Person.class);
+        p2.setName("Julia");
+
+        final Person bryn = fg.v().has("name", "Bryn").next(Person.class);
+        final Person julia = fg.v().has("name", "Julia").next(Person.class);
+
+        Assert.assertEquals(Person.class, bryn.getClass());
+        Assert.assertEquals(Person.class, julia.getClass());
+    }
 
     @Test
     public void testJavaTypingNextExplicit() {
@@ -139,6 +219,24 @@ public class FramedGraphTest {
         Assert.assertEquals(Person.class, bryn.getClass());
         Assert.assertEquals(Person.class, julia.getClass());
     }
+    
+    @Test
+    public void testJavaTypingNextExplicitByClass() {
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g, true, false);
+
+        final Person p1 = fg.addFramedVertex(Programmer.class);
+        p1.setName("Bryn");
+
+        final Person p2 = fg.addFramedVertex(Person.class);
+        p2.setName("Julia");
+
+        final Person bryn = fg.v().has("name", "Bryn").nextExplicit(Person.class);
+        final Person julia = fg.v().has("name", "Julia").nextExplicit(Person.class);
+
+        Assert.assertEquals(Person.class, bryn.getClass());
+        Assert.assertEquals(Person.class, julia.getClass());
+    }
 
     @Test
     public void testCustomFrameBuilder() {
@@ -155,6 +253,22 @@ public class FramedGraphTest {
         final Person person = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
         Assert.assertEquals(o, person);
     }
+    
+    @Test
+    public void testCustomFrameBuilderByClass() {
+        final Person o = new Person();
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g, new FrameFactory() {
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public <T> T create(final Element e, final Class<T> kind) {
+                return (T) o;
+            }
+        }, new SimpleTypeResolver());
+        final Person person = fg.addFramedVertex(Person.class);
+        Assert.assertEquals(o, person);
+    }
 
     @Test
     public void testCustomFrameBuilderExplicit() {
@@ -171,6 +285,22 @@ public class FramedGraphTest {
         final Person person = fg.addFramedVertexExplicit(Person.DEFAULT_INITIALIZER);
         Assert.assertEquals(o, person);
     }
+    
+    @Test
+    public void testCustomFrameBuilderExplicitByClass() {
+        final Person o = new Person();
+        final Graph g = new TinkerGraph();
+        final FramedGraph fg = new DelegatingFramedGraph(g, new FrameFactory() {
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public <T> T create(final Element e, final Class<T> kind) {
+                return (T) o;
+            }
+        }, new SimpleTypeResolver());
+        final Person person = fg.addFramedVertexExplicit(Person.class);
+        Assert.assertEquals(o, person);
+    }
 
     @Mock
     private TransactionalGraph transactionalGraph;
diff --git a/src/test/java/com/syncleus/ferma/FramedVertexTest.java b/src/test/java/com/syncleus/ferma/FramedVertexTest.java
index 8dd0f212..f5d1be70 100644
--- a/src/test/java/com/syncleus/ferma/FramedVertexTest.java
+++ b/src/test/java/com/syncleus/ferma/FramedVertexTest.java
@@ -133,7 +133,7 @@ public class FramedVertexTest {
 
     @Test
     public void testLinkOutSingleLabel() {
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final String label = "knows";
@@ -153,7 +153,7 @@ public class FramedVertexTest {
 
         final String[] newLabels = new String[]{"knows", "friends_with"};
 
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final Map<String, Number> expectedCounts = new HashMap<>();
@@ -177,7 +177,7 @@ public class FramedVertexTest {
 
     @Test
     public void testLinkInSingleLabel() {
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final String label = "knows";
@@ -197,7 +197,7 @@ public class FramedVertexTest {
 
         final String[] newLabels = new String[]{"knows", "friends_with"};
 
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final Map<String, Number> expectedCounts = new HashMap<>();
@@ -222,7 +222,7 @@ public class FramedVertexTest {
 
     @Test
     public void testLinkBothSingleLabel() {
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final String label = "knows";
@@ -244,7 +244,7 @@ public class FramedVertexTest {
 
         final String[] newLabels = new String[]{"knows", "friends_with"};
 
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
         p3.setName("Tjad");
 
         final Map<String, Number> expectedCounts = new HashMap<>();
@@ -272,12 +272,12 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkInWithNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p5.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
+        p5.addFramedEdge(label, p3, Knows.class);
 
         Assert.assertTrue("Multiple edges(in) of type " + label + " must exist for vertice", p3.in(label).count() > 1);
 
@@ -290,12 +290,12 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkOutWithNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p5, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
+        p3.addFramedEdge(label, p5, Knows.class);
 
         Assert.assertTrue("Multiple edges(out) of type " + label + " must exist for vertice", p3.out(label).count() > 1);
 
@@ -309,17 +309,17 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkBothWithNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p5, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
+        p3.addFramedEdge(label, p5, Knows.class);
 
         Assert.assertTrue("Multiple edges(out) of type " + label + " must exist for vertice", p3.out(label).count() > 1);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p5.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
+        p5.addFramedEdge(label, p3, Knows.class);
 
         Assert.assertTrue("Multiple edges(in) of type " + label + " must exist for vertice", p3.in(label).count() > 1);
 
@@ -333,12 +333,12 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkIn() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p5.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
+        p5.addFramedEdge(label, p3, Knows.class);
         final long allInEdgesCount = p3.in(label).count();
         final Long targetVertex_InEdgeCount = p3.in(label).mark().retain(Lists.newArrayList(p4)).back().count();
 
@@ -355,12 +355,12 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkOut() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p5, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
+        p3.addFramedEdge(label, p5, Knows.class);
         final long allInEdgesCount = p3.out(label).count();
         final Long targetVertex_OutEdgeCount = p3.out(label).mark().retain(Lists.newArrayList(p4)).back().count();
 
@@ -377,14 +377,14 @@ public class FramedVertexTest {
     @Test
     public void testUnlinkBoth() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p5.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p5, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
+        p5.addFramedEdge(label, p3, Knows.class);
+        p3.addFramedEdge(label, p4, Knows.class);
+        p3.addFramedEdge(label, p5, Knows.class);
 
         final long allInEdgesCount = p3.both(label).count();
         final Long targetVertex_EdgeCount = p3.both(label).mark().retain(Lists.newArrayList(p4)).back().count();
@@ -402,11 +402,11 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkIn() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
 
         Assert.assertTrue("An edge(in) of type " + label + " must exist between vertices", p3.in(label).retain(Lists.newArrayList(p4)).count() > 0);
 
@@ -423,8 +423,8 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkInNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
         p3.setLinkIn(p4, label);
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.in(label).retain(Lists.newArrayList(p4)).count() > 0);
 
@@ -436,11 +436,11 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkOut() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
 
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.out(label).retain(Lists.newArrayList(p4)).count() > 0);
 
@@ -457,8 +457,8 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkOutNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
         p3.setLinkOut(p4, label);
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.out(label).retain(Lists.newArrayList(p4)).count() > 0);
 
@@ -470,12 +470,12 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkBoth() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p5 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
+        final Person p5 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
+        p3.addFramedEdge(label, p4, Knows.class);
 
         Assert.assertTrue("An in edge of type " + label + " must exist between vertices", p3.in(label).retain(Lists.newArrayList(p4)).count() > 0);
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.out(label).retain(Lists.newArrayList(p4)).count() > 0);
@@ -496,8 +496,8 @@ public class FramedVertexTest {
     @Test
     public void testSetLinkBothNull() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
         p3.setLinkBoth(p4, label);
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.both(label).retain(Lists.newArrayList(p4)).count() > 0);
 
@@ -509,14 +509,14 @@ public class FramedVertexTest {
     @Test
     public void testSetNewLinkIn() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
 
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p4.addFramedEdge(label, p3, Knows.class);
 
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.in(label).retain(Lists.newArrayList(p4)).count() > 0);
 
-        final Person p5 = p3.setLinkIn(Person.DEFAULT_INITIALIZER, label);
+        final Person p5 = p3.setLinkIn(Person.class, label);
 
         //Make sure old edge was deleted
         Assert.assertEquals("old " + label + " edge was not removed", 0, p3.in(label).retain(Lists.newArrayList(p4)).count());
@@ -530,14 +530,14 @@ public class FramedVertexTest {
     @Test
     public void testSetNewLinkOut() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
 
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.out(label).retain(Lists.newArrayList(p4)).count() > 0);
 
-        final Person p5 = p3.setLinkOut(Person.DEFAULT_INITIALIZER, label);
+        final Person p5 = p3.setLinkOut(Person.class, label);
 
         //Make sure old edge was deleted
         Assert.assertEquals("old " + label + " edge was not removed", 0, p3.out(label).retain(Lists.newArrayList(p4)).count());
@@ -551,16 +551,16 @@ public class FramedVertexTest {
     @Test
     public void testSetNewLinkBoth() {
         final String label = "knows";
-        final Person p3 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
-        final Person p4 = fg.addFramedVertex(Person.DEFAULT_INITIALIZER);
+        final Person p3 = fg.addFramedVertex(Person.class);
+        final Person p4 = fg.addFramedVertex(Person.class);
 
-        p3.addFramedEdge(label, p4, Knows.DEFAULT_INITIALIZER);
-        p4.addFramedEdge(label, p3, Knows.DEFAULT_INITIALIZER);
+        p3.addFramedEdge(label, p4, Knows.class);
+        p4.addFramedEdge(label, p3, Knows.class);
 
         Assert.assertTrue("An in edge of type " + label + " must exist between vertices", p3.in(label).retain(Lists.newArrayList(p4)).count() > 0);
         Assert.assertTrue("An out edge of type " + label + " must exist between vertices", p3.out(label).retain(Lists.newArrayList(p4)).count() > 0);
 
-        final Person p5 = p3.setLinkBoth(Person.DEFAULT_INITIALIZER, label);
+        final Person p5 = p3.setLinkBoth(Person.class, label);
 
         //Make sure old edge was deleted
         Assert.assertEquals("old " + label + " edge was not removed", 0, p3.both(label).retain(Lists.newArrayList(p4)).count());
diff --git a/src/test/java/com/syncleus/ferma/SimpleTypeResolverTest.java b/src/test/java/com/syncleus/ferma/SimpleTypeResolverTest.java
index 4f10b05f..e481576d 100644
--- a/src/test/java/com/syncleus/ferma/SimpleTypeResolverTest.java
+++ b/src/test/java/com/syncleus/ferma/SimpleTypeResolverTest.java
@@ -34,7 +34,7 @@ public class SimpleTypeResolverTest {
         final FramedGraph framedGraph = new DelegatingFramedGraph(godGraph, TEST_TYPES);
 
         //add a single node to the graph, a programmer.
-        framedGraph.addFramedVertex(Programmer.DEFAULT_INITIALIZER);
+        framedGraph.addFramedVertex(Programmer.class);
 
         //make sure the newly added node is actually a programmer
         final Person programmer = framedGraph.v().next(Person.class);
-- 
GitLab