@Override
    public MemoryComputeKey<A> clone() {
        try {
            final MemoryComputeKey<A> clone = (MemoryComputeKey<A>) super.clone();

            try {
                final Method cloneMethod = this.reducer.getClass().getMethod("clone");
                if (cloneMethod != null)
                    clone.reducer = (BinaryOperator<A>) cloneMethod.invoke(this.reducer);
            } catch(Exception ignored) {

            }

            return clone;
        } catch (final CloneNotSupportedException e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }
A {@code MemoryComputeKey} specifies what keys will be used by a {@link Memory} during a {@link GraphComputer} computation.
A MemoryComputeKey maintains a {@link BinaryOperator} which specifies how to reduce parallel values into a single value.
A MemoryComputeKey can be broadcasted and as such, the workers will receive mutations to the {@link Memory} value.
A MemoryComputeKey can be transient and thus, will not be accessible once the {@link GraphComputer} computation is complete.

@author Marko A. Rodriguez (http://markorodriguez.com)
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java