<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="ObjectModelDefinition" type="objectModelDefinition"/>

  <xs:complexType name="objectModelDefinition">
    <xs:sequence>
      <xs:element name="Name" type="xs:string" minOccurs="0"/>
      <xs:element name="RootPackage" type="package" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="package">
    <xs:sequence>
      <xs:element name="Packages" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Package" type="package" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Structures" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Structure" type="structure" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="structure">
    <xs:sequence>
      <xs:element name="Parent" type="structure" minOccurs="0"/>
      <xs:element name="Fields" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Field" type="field" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Methods" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Method" type="method" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="field">
    <xs:complexContent>
      <xs:extension base="data">
        <xs:sequence/>
        <xs:attribute name="transient" type="xs:boolean" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="data" abstract="true">
    <xs:sequence>
      <xs:element name="Type" type="type" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="description" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="type">
    <xs:sequence>
      <xs:element name="GenericsParameters" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="GenericsParameter" type="type" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="generatedClass" type="xs:string"/>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="method">
    <xs:sequence>
      <xs:element name="Arguments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Argument" type="argument" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="ReturnValue" type="returnValue" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="argument">
    <xs:complexContent>
      <xs:extension base="argumentOrReturnValue">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="argumentOrReturnValue" abstract="true">
    <xs:complexContent>
      <xs:extension base="data">
        <xs:sequence/>
        <xs:attribute name="isList" type="xs:boolean" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="returnValue">
    <xs:complexContent>
      <xs:extension base="argumentOrReturnValue">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

