//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.6 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2013.02.27 at 11:03:32 AM EST 
//


package org.eclipse.persistence.jaxb.xmlmodel;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://www.eclipse.org/eclipselink/xsds/persistence/oxm}xml-named-object-graph" maxOccurs="unbounded"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "xmlNamedObjectGraph"
})
@XmlRootElement(name = "xml-named-object-graphs")
public class XmlNamedObjectGraphs {

    @XmlElement(name = "xml-named-object-graph", required = true)
    protected List<XmlNamedObjectGraph> xmlNamedObjectGraph;

    /**
     * Gets the value of the xmlNamedObjectGraph property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the xmlNamedObjectGraph property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getXmlNamedObjectGraph().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link XmlNamedObjectGraph }
     * 
     * 
     */
    public List<XmlNamedObjectGraph> getXmlNamedObjectGraph() {
        if (xmlNamedObjectGraph == null) {
            xmlNamedObjectGraph = new ArrayList<XmlNamedObjectGraph>();
        }
        return this.xmlNamedObjectGraph;
    }

}
