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"?>
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0" rng:datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
	<rng:start>
		<rng:element name="hopkins">
			<rng:interleave>
				<rng:zeroOrMore>
					<rng:element name="plugin">
						<rng:attribute name="name">
							<rng:text />
						</rng:attribute>
						<rng:ref name="anything" />
					</rng:element>
				</rng:zeroOrMore>

				<rng:zeroOrMore>
					<rng:element name="database">
						<rng:interleave>
							<rng:element name="dsn">
								<rng:text />
							</rng:element>
							<rng:element name="user">
								<rng:text />
							</rng:element>
							<rng:element name="pass">
								<rng:text />
							</rng:element>
							<rng:optional>
								<rng:ref name="options" />
							</rng:optional>
						</rng:interleave>
					</rng:element>
				</rng:zeroOrMore>

				<rng:zeroOrMore>
					<rng:element name="queue">
						<rng:attribute name="name">
							<rng:text />
						</rng:attribute>
						<rng:optional>
							<rng:element name="concurrency">
								<rng:data type="int" />
							</rng:element>
						</rng:optional>
						<rng:optional>
							<rng:attribute name="onerror">
								<rng:choice>
									<rng:value type="string">halt</rng:value>
									<rng:value type="string">freeze</rng:value>
									<rng:value type="string">shutdown</rng:value>
								</rng:choice>
							</rng:attribute>
						</rng:optional>
					</rng:element>
				</rng:zeroOrMore>

				<rng:zeroOrMore>
					<rng:element name="task">
						<rng:attribute name="name">
							<rng:text />
						</rng:attribute>
						<rng:optional>
							<rng:attribute name="onerror">
								<rng:choice>
									<rng:value type="string">disable</rng:value>
								</rng:choice>
							</rng:attribute>
						</rng:optional>
						<rng:optional>
							<rng:attribute name="enabled">
								<rng:choice>
									<rng:value type="string">no</rng:value>
									<rng:value type="string">yes</rng:value>
								</rng:choice>
							</rng:attribute>
						</rng:optional>
						<rng:optional>
							<rng:attribute name="run">
								<rng:choice>
									<rng:value type="string">serial</rng:value>
									<rng:value type="string">parallel</rng:value>
								</rng:choice>
							</rng:attribute>
						</rng:optional>
						<rng:interleave>
							<rng:element name="queue">
								<rng:text />
							</rng:element>
							<rng:choice>
								<rng:element name="cmd">
									<rng:text />
								</rng:element>
								<rng:element name="class">
									<rng:text />
								</rng:element>
							</rng:choice>
							<rng:zeroOrMore>
								<rng:element name="schedule">
									<rng:text />
								</rng:element>
							</rng:zeroOrMore>
							<rng:optional>
								<rng:ref name="options" />
							</rng:optional>
							<rng:optional>
								<rng:ref name="chain" />
							</rng:optional>
						</rng:interleave>
					</rng:element>
				</rng:zeroOrMore>

			</rng:interleave>
		</rng:element>
	</rng:start>

	<rng:define name="anything">
		<rng:element>
			<rng:anyName />
			<rng:zeroOrMore>
				<rng:choice>
					<rng:attribute>
						<rng:anyName />
					</rng:attribute>
					<rng:text/>
					<rng:ref name="anything" />
				</rng:choice>
			</rng:zeroOrMore>
		</rng:element>
	</rng:define>

	<rng:define name="options">
		<rng:element name="options">
			<rng:oneOrMore>
				<rng:element name="option">
					<rng:attribute name="name">
						<rng:text />
					</rng:attribute>
					<rng:attribute name="value">
						<rng:text />
					</rng:attribute>
				</rng:element>
			</rng:oneOrMore>
		</rng:element>
	</rng:define>

	<rng:define name="chain">
		<rng:element name="chain">
			<rng:attribute name="task">
				<rng:text />
			</rng:attribute>
			<rng:optional>
				<rng:ref name="options" />
			</rng:optional>
			<rng:optional>
				<rng:ref name="chain" />
			</rng:optional>
		</rng:element>
	</rng:define>
</rng:grammar>