The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="hopkins" type="hopkins" />

	<xs:complexType name="hopkins">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element name="plugin" type="plugin" />
			<xs:element name="database" type="database" />
			<xs:element name="queue" type="queue" />
			<xs:element name="task" type="task" />
			<xs:element name="state" type="state" />
		</xs:choice>
	</xs:complexType>

	<xs:complexType name="state">
		<xs:sequence>
			<xs:element name="root" type="xs:string" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="plugin">
		<xs:sequence>
			<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" />
	</xs:complexType>

	<xs:complexType name="database">
		<xs:all>
			<xs:element name="dsn" />
			<xs:element name="user" />
			<xs:element name="pass" />
			<xs:element name="options" type="dboptions" minOccurs="0" />
		</xs:all>
	</xs:complexType>

	<xs:complexType name="dboptions">
		<xs:sequence>
			<xs:element name="option" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="options">
		<xs:sequence>
			<xs:element name="option" type="option" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="option">
		<xs:all>
			<xs:element name="choices" type="choices" minOccurs="0" />
		</xs:all>

		<xs:attribute name="name" type="xs:string" />
		<xs:attribute name="value" type="xs:string" />
		<xs:attribute name="type">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="bool" />
					<xs:enumeration value="text" />
					<xs:enumeration value="combo" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="choices">
		<xs:sequence>
			<xs:element name="choice" minOccurs="0" maxOccurs="unbounded" />
		</xs:sequence>

		<xs:attribute name="type">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="json" />
					<xs:enumeration value="xml" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="src" type="xs:string" />
		<xs:attribute name="root" type="xs:string" />
		<xs:attribute name="name" type="xs:string" />
		<xs:attribute name="value" type="xs:string" />
	</xs:complexType>

	<xs:complexType name="queue">
		<xs:sequence>
			<xs:element name="concurrency" type="xs:integer" />
		</xs:sequence>

		<xs:attribute name="name" type="xs:string" />
		<xs:attribute name="onerror">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="halt" />
					<xs:enumeration value="freeze" />
					<xs:enumeration value="shutdown" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="task">
		<xs:all>
			<xs:element name="cmd" type="xs:string" minOccurs="0" />
			<xs:element name="class" type="xs:string" minOccurs="0" />
			<xs:element name="queue" type="xs:string" />
			<xs:element name="schedule" type="schedule" minOccurs="0" />
			<xs:element name="options" type="options" minOccurs="0" />
			<xs:element name="chain" type="chain" minOccurs="0" />
		</xs:all>

		<xs:attribute name="name" type="xs:string" />
		<xs:attribute name="run">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="serial" />
					<xs:enumeration value="parallel" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="enabled">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="yes" />
					<xs:enumeration value="no" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="stack">
			<xs:simpleType>
				<xs:union>
					<xs:simpleType>
						<xs:restriction base="xs:string">
							<xs:enumeration value="yes" />
							<xs:enumeration value="no" />
						</xs:restriction>
					</xs:simpleType>
					<xs:simpleType>
						<xs:restriction base="xs:integer">
							<xs:minInclusive value="-1" />
						</xs:restriction>
					</xs:simpleType>
				</xs:union>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="onerror">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="disable" />
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>

	<xs:complexType name="schedule">
		<xs:sequence>
			<xs:element name="cron" type="xs:string" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="chain">
		<xs:all>
			<xs:element name="options" type="options" minOccurs="0" />
			<xs:element name="chain" type="chain" minOccurs="0" />
		</xs:all>

		<xs:attribute name="task" type="xs:string" />
	</xs:complexType>
</xs:schema>