package com.tinkerpop.gremlin.structure;

import com.tinkerpop.gremlin.process.graph.MetaPropertyTraversal;
import com.tinkerpop.gremlin.structure.util.EmptyMetaProperty;

import java.util.Iterator;

/**
 * @author Matthias Broecheler (me@matthiasb.com)
 * @author Marko A. Rodriguez (http://markorodriguez.com)
 */
public interface MetaProperty<V> extends Property<V>, Element, MetaPropertyTraversal {

    public static final String DEFAULT_LABEL = "metaProperty";
    public static final String VALUE = "value";
    public static final String KEY = "key";

    @Override
    public Vertex getElement();

    @Override
    public default String label() {
        return DEFAULT_LABEL;
    }

    public static <V> MetaProperty<V> empty() {
        return EmptyMetaProperty.instance();
    }

    @Override
    public MetaProperty.Iterators iterators();

    public interface Iterators extends Element.Iterators {

        @Override
        public <U> Iterator<Property<U>> properties(final String... propertyKeys);

        @Override
        public <U> Iterator<Property<U>> hiddens(final String... propertyKeys);
    }
}

@@ -197,16 +197,636 @@
 r;%0A%0A/**%0A
+ * A %7B@code MetaProperty%7D is similar to a %7B@link Property%7D in that it denotes a key/value pair associated with an%0A * %7B@link Vertex%7D, however it is different in the sense that it also represents an entity that it is an %7B@link Element%7D%0A * that can have properties of its own.%0A * %3Cbr/%3E%0A * A property is much like a Java8 %7B@link java.util.Optional%7D in that a property can be not present (i.e. empty).%0A * The key of a property is always a String and the value of a property is an arbitrary Java object.%0A * Each underlying graph engine will typically have constraints on what Java objects are allowed to be used as values.%0A *%0A
  * @auth
@@ -925,16 +925,75 @@
 ez.com)%0A
+ * @author Stephen Mallette (http://stephen.genoprime.com)%0A
  */%0Apubl

Add javadoc to MetaProperty.