From 9fdb6a2735ebe083e899e83bd119135261357e57 Mon Sep 17 00:00:00 2001
From: dkuhlman <none@none>
Date: Tue, 9 Sep 2014 13:06:49 -0700
Subject: [PATCH] New version -- version 2.13a

---
 README                            |    6 +-
 generateDS.html                   |   10 +-
 generateDS.py                     |    8 +-
 generateDS.txt                    |    4 +-
 gui/generateds_gui.py             |    2 +-
 librarytemplate_howto.html        |    8 +-
 librarytemplate_howto.txt         |    2 +-
 process_includes.py               |    2 +-
 setup.py                          |    2 +-
 tests/prefix_classname.xml        |  118 ++
 tests/prefix_classname.xsd        |  203 ++
 tests/prefix_classname1_out.xml   |   91 +
 tests/prefix_classname1_sub.py    |  292 +++
 tests/prefix_classname1_sup.py    | 2897 +++++++++++++++++++++++++++++
 tests/prefix_classname2_out.xml   |   91 +
 tests/prefix_classname2_sub.py    |  292 +++
 tests/prefix_classname2_sup.py    | 2897 +++++++++++++++++++++++++++++
 tests/test.py                     |   25 +
 tutorial/generateds_tutorial.html |    8 +-
 tutorial/generateds_tutorial.txt  |    2 +-
 tutorial/generateds_tutorial.zip  |  Bin 48759 -> 48761 bytes
 updateversion.py                  |  143 ++
 22 files changed, 7078 insertions(+), 25 deletions(-)
 create mode 100644 tests/prefix_classname.xml
 create mode 100644 tests/prefix_classname.xsd
 create mode 100644 tests/prefix_classname1_out.xml
 create mode 100644 tests/prefix_classname1_sub.py
 create mode 100644 tests/prefix_classname1_sup.py
 create mode 100644 tests/prefix_classname2_out.xml
 create mode 100644 tests/prefix_classname2_sub.py
 create mode 100644 tests/prefix_classname2_sup.py
 create mode 100755 updateversion.py

diff --git a/README b/README
index 8ab152e..5cdd6eb 100644
--- a/README
+++ b/README
@@ -141,10 +141,14 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
-Version 2.12g (09/03/2014)
+Version 2.13a (09/09/2014)
 - Minor fix to function generateToEtreeChildren.  Must generate
   call to get_valueOf only when defined (i.e. when element is
   simpleContent or isMixed).
+- Fix to generation of class name prefixes added with the "-p"
+  command line option.  This fix was added by Christian Ascheberg.
+  Thank you Christian.
+- Added unit test for class name prefixes command line option.
 
 Version 2.12f (08/12/2014)
 - Fix for substitutionGroup conflict with keyword name mapping.
diff --git a/generateDS.html b/generateDS.html
index 15ff8bd..4ed9fd4 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13: http://docutils.sourceforge.net/" />
 <title>generateDS -- Generate Data Structures from XML Schema</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -205,7 +205,7 @@ ul.auto-toc {
 <tr><th class="docinfo-name">Author:</th>
 <td>Dave Kuhlman</td></tr>
 <tr><th class="docinfo-name">Contact:</th>
-<td><a class="first last reference external" href="mailto:dkuhlman&#64;pacbell.net">dkuhlman&#64;pacbell.net</a></td></tr>
+<td><a class="first last reference external" href="mailto:dkuhlman&#64;davekuhlman.org">dkuhlman&#64;davekuhlman.org</a></td></tr>
 <tr><th class="docinfo-name">Address:</th>
 <td><pre class="address">
 <a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12e</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 30, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -2886,7 +2886,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2014-05-30 18:59 UTC.
+Generated on: 2014-09-09 20:05 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateDS.py b/generateDS.py
index 0bb303d..7c32e5d 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -179,7 +179,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.12g'
+VERSION = '2.13a'
 ##VERSION##
 
 GenerateProperties = 0
@@ -4281,7 +4281,7 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
         generateExportLiteralFn(wrt, prefix, element)
     generateBuildFn(wrt, prefix, element, delayed)
     generateUserMethods(wrt, element)
-    wrt('# end class %s\n' % name)
+    wrt('# end class %s%s\n' % (prefix, name, ))
     wrt('\n\n')
 # end generateClasses
 
@@ -5957,7 +5957,7 @@ def parseAndGenerate(
         # can do a reasonably safe "from parser import *"
         if outfileName:
             exportableClassList = [
-                '"%s"' % name
+                '"%s%s"' % (prefix, name, )
                 for name in AlreadyGenerated]
             exportableClassList.sort()
             exportableClassNames = ',\n    '.join(exportableClassList)
@@ -6031,7 +6031,7 @@ def parseAndGenerate(
                 # to isolate important classes from internal ones. This way one
                 # can do a reasonably safe "from parser import *"
                 exportableClassList = [
-                    '"%s"' % name
+                    '"%s%s"' % (prefix, name, )
                     for name in AlreadyGenerated]
                 exportableClassList.sort()
                 exportableClassNames = ',\n    '.join(exportableClassList)
diff --git a/generateDS.txt b/generateDS.txt
index e831964..0cfa919 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -3,7 +3,7 @@ generateDS -- Generate Data Structures from XML Schema
 ======================================================
 
 :author: Dave Kuhlman
-:contact: dkuhlman@pacbell.net
+:contact: dkuhlman@davekuhlman.org
 :address:
     http://www.davekuhlman.org
 
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.12g
+:revision: 2.13a
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 60aef40..8622d68 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.12g'
+VERSION = '2.13a'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 1a2df9d..db0373e 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13: http://docutils.sourceforge.net/" />
 <title>How to package a generateDS.py generated library</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -217,7 +217,7 @@ ul.auto-toc {
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12e</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +226,7 @@ ul.auto-toc {
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 23, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -380,7 +380,7 @@ this command for your needs.  For example, you may need to use
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="librarytemplate_howto.txt">View document source</a>.
-Generated on: 2014-05-23 16:00 UTC.
+Generated on: 2014-09-09 19:14 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 32f3bf1..51928ab 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.12g
+:revision: 2.13a
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 6bb5347..31ba6af 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -30,7 +30,7 @@ from lxml import etree
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.12g'
+VERSION = '2.13a'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index 515df70..0bdcc97 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.12g",
+    version="2.13a",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/prefix_classname.xml b/tests/prefix_classname.xml
new file mode 100644
index 0000000..322414c
--- /dev/null
+++ b/tests/prefix_classname.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<people>
+
+    <comments>1. This is a <emp>foolish</emp> comment.  It is <emp>really</emp> important.</comments>
+    <comments>2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.</comments>
+
+
+    <person id="1" value="abcd" ratio="3.2" extraattr="aaa">
+        <name>Alberta</name>
+        <interest>gardening</interest>
+        <interest>reading</interest>
+        <category>5</category>
+        <hot  />
+        <hot.agent oneattr="bbb" twoattr="ccc">
+            <firstname>Paula</firstname>
+            <lastname>Peterson</lastname>
+            <priority>4.3</priority>
+        </hot.agent>
+    </person> 
+
+    <person id="2">
+        <name>Bernardo</name>
+        <interest>programming</interest>
+        <category>0</category>
+        <agent>
+            <firstname>Darren</firstname>
+            <lastname>Diddly</lastname>
+            <priority>4.5</priority>
+            <info name="Albert Abasinian" type="321" rating="5.33">
+            Albert is a test for attributes + character content +
+            *no* element content.
+            </info>
+        </agent>
+    </person>
+
+    <programmer id="2" language="python" area="xml">
+        <name>Charles Carlson</name>
+        <interest>programming</interest>
+        <category>2233</category>
+        <description>A very happy programmer</description>
+        <email>charles@happyprogrammers.com</email>
+        <agent>
+            <firstname>Ernest</firstname>
+            <lastname>Echo</lastname>
+            <priority>3.8</priority>
+            <info name="George Gregory" type="321" rating="5.33" />
+        </agent>
+        <elposint>14</elposint>
+        <elnegint>-12</elnegint>
+        <elnonnegint>4</elnonnegint>
+        <elnonposint>0</elnonposint>
+        <eldate>2005-04-26</eldate>
+        <eldatetime>2005-04-26T10:11:12</eldatetime>
+        <eltoken>aa bb    cc
+            dd</eltoken>
+        <elshort>123</elshort>
+        <ellong>13241234123412341234</ellong>
+        <elparam id="id001" name="Davy" semantic="a big    semantic"/>
+    </programmer>
+
+    <person id="3">
+        <name>Charlie</name>
+        <interest>people</interest>
+        <interest>cats</interest>
+        <interest>dogs</interest>
+        <category>8</category>
+        <promoter>
+            <firstname>David</firstname>
+            <lastname>Donaldson</lastname>
+            <client>
+                <fullname>Arnold Applebee</fullname>
+                <refid>10001</refid>
+            </client>
+        </promoter>
+        <promoter>
+            <firstname>Edward</firstname>
+            <lastname>Eddleberry</lastname>
+            <client>
+                <fullname>Arnold Applebee</fullname>
+                <refid>10001</refid>
+            </client>
+        </promoter>
+    </person>
+
+    <person id="4" />
+
+    <python-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd">
+        <favorite-editor>jed</favorite-editor>
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55" />
+        </agent>
+    </python-programmer>
+
+    <java-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd">
+        <favorite-editor>jed</favorite-editor>
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55" />
+        </agent>
+    </java-programmer>
+
+</people>
+
diff --git a/tests/prefix_classname.xsd b/tests/prefix_classname.xsd
new file mode 100644
index 0000000..a852025
--- /dev/null
+++ b/tests/prefix_classname.xsd
@@ -0,0 +1,203 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="people">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="comments" type="comments" maxOccurs="unbounded"/>
+                <xs:element name="person" maxOccurs="unbounded" type="person"/>
+                <xs:element name="programmer" maxOccurs="unbounded" type="programmer"/>
+                <xs:element name="python-programmer" maxOccurs="unbounded" type="python-programmer"/>
+                <xs:element name="java-programmer" maxOccurs="unbounded" type="java-programmer"/>
+			</xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="comments">
+        <xs:complexType mixed="true">
+            <xs:sequence>
+                <!-- 
+                <xs:element name="emp" type="xs:string" />
+                -->
+                <xs:element name="emp" type="xs:string" maxOccurs="unbounded"/>
+			</xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="person">
+        <xs:complexType mixed="0">
+            <xs:sequence>
+                <xs:element name="name" type="xs:string"/>
+                <xs:element name="interest" type="xs:string" maxOccurs="unbounded" />
+				<xs:element name="category" type="xs:integer"/>
+                <xs:element name="agent" type="agent" maxOccurs="unbounded" />
+                <xs:element name="promoter" type="booster" maxOccurs="unbounded" />
+                <xs:element name="description" type="xs:string"/>
+			</xs:sequence>
+            <xs:attribute name="value" type="xs:ID" />
+            <xs:attribute name="id" type="xs:integer" />
+            <xs:attribute name="ratio" type="xs:float" />
+            <xs:attributeGroup ref="favorites" />
+        </xs:complexType>
+    </xs:element>
+
+    <!--
+    <xs:element name="description-a" type="xs:string" substitutionGroup="description" />
+    -->
+
+    <xs:element name="programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="person">
+                    <xs:sequence>
+                        <!--
+                        <xs:element name="description" type="xs:string"/>
+                        -->
+                        <xs:element name="email" type="xs:string"/>
+                        <xs:element name="elposint" type="xs:positiveInteger"/>
+                        <xs:element name="elnonposint" type="xs:nonPositiveInteger"/>
+                        <xs:element name="elnegint" type="xs:negativeInteger"/>
+                        <xs:element name="elnonnegint" type="xs:nonNegativeInteger"/>
+                        <xs:element name="eldate" type="xs:date"/>
+                        <xs:element name="eldatetime" type="xs:dateTime"/>
+                        <xs:element name="eltoken" type="xs:token"/>
+                        <xs:element name="elshort" type="xs:short"/>
+                        <xs:element name="ellong" type="xs:long"/>
+                        <xs:element name="elparam" type="param"/>
+                        <xs:element name="elarraytypes" type="ArrayTypes"/>
+                        
+                    </xs:sequence>
+                    <xs:attribute name="language" type="xs:string" />
+                    <xs:attribute name="area"/>
+                    <xs:attribute name="attrposint" type="xs:positiveInteger"/>
+                    <xs:attribute name="attrnonposint" type="xs:nonPositiveInteger"/>
+                    <xs:attribute name="attrnegint" type="xs:negativeInteger"/>
+                    <xs:attribute name="attrnonnegint" type="xs:nonNegativeInteger"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+
+    <xs:element name="param">
+        <xs:annotation>
+            <xs:documentation>Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:attribute name="id" type="xs:ID" />
+                    <xs:attribute name="name" type="xs:NCName" />
+                    <xs:attribute name="sid" type="xs:NCName" />
+                    <xs:attribute name="flow" type="FlowType" />
+                    <xs:attribute name="semantic" type="xs:token" />
+                    <xs:attribute name="type" type="xs:NMTOKEN" use="required" />
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+
+    <xs:simpleType name="ArrayTypes">
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="float" />
+            <xs:enumeration value="int" />
+            <xs:enumeration value="Name" />
+            <xs:enumeration value="token" />
+        </xs:restriction>
+    </xs:simpleType>
+
+
+
+    <xs:element name="python-programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="programmer">
+                    <xs:sequence>
+                        <xs:element name="favorite-editor" type="xs:string"/>
+                    </xs:sequence>
+                    <xs:attribute name="nick-name"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="java-programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="programmer">
+                    <xs:sequence>
+                        <xs:element name="favorite-editor" type="xs:string"/>
+                    </xs:sequence>
+                    <xs:attribute name="nick-name"/>
+                    <xs:attribute name="status"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="agent">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="priority" type="xs:float"/>
+                <xs:element name="info" type="info"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="special-agent" substitutionGroup="agent">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="priority" type="xs:float"/>
+                <xs:element name="info" type="info"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="booster">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="other-name" type="xs:float"/>
+                <xs:element name="class" type="xs:float"/>
+                <xs:element name="other-value" type="xs:float" maxOccurs="unbounded" />
+                <xs:element name="type" type="xs:float" maxOccurs="unbounded" />
+                <xs:element name="client-handler" maxOccurs="unbounded">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="fullname" type="xs:string"/>
+                            <xs:element name="refid" type="xs:integer"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <!-- Test for element with attributes but no children.
+         Should use valueOf.
+    -->
+    <xs:element name="info">
+        <xs:complexType>
+            <xs:sequence>
+			</xs:sequence>
+            <xs:attribute name="name" type="xs:string" />
+            <xs:attribute name="type" type="xs:integer" />
+            <xs:attribute name="rating" type="xs:float" />
+        </xs:complexType>
+    </xs:element>
+
+
+  <xs:attributeGroup name="favorites">
+    <xs:attribute name="fruit" />
+    <xs:attribute name="vegetable" />
+  </xs:attributeGroup>
+
+ 
+</xs:schema>
+
diff --git a/tests/prefix_classname1_out.xml b/tests/prefix_classname1_out.xml
new file mode 100644
index 0000000..c2e2e7e
--- /dev/null
+++ b/tests/prefix_classname1_out.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" ?>
+<people>
+    <comments>
+1. This is a <emp>foolish</emp> comment.  It is <emp>really</emp> important.    </comments>
+    <comments>
+2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.    </comments>
+    <person ratio="3.2" id="1" value="abcd">
+        <name>Alberta</name>
+        <interest>gardening</interest>
+        <interest>reading</interest>
+        <category>5</category>
+    </person>
+    <person id="2">
+        <name>Bernardo</name>
+        <interest>programming</interest>
+        <category>0</category>
+        <agent>
+            <firstname>Darren</firstname>
+            <lastname>Diddly</lastname>
+            <priority>4.5</priority>
+            <info rating="5.33" type="321" name="Albert Abasinian"/>
+        </agent>
+    </person>
+    <person id="3">
+        <name>Charlie</name>
+        <interest>people</interest>
+        <interest>cats</interest>
+        <interest>dogs</interest>
+        <category>8</category>
+        <promoter>
+            <firstname>David</firstname>
+            <lastname>Donaldson</lastname>
+        </promoter>
+        <promoter>
+            <firstname>Edward</firstname>
+            <lastname>Eddleberry</lastname>
+        </promoter>
+    </person>
+    <person id="4"/>
+    <programmer id="2" language="python" area="xml">
+        <name>Charles Carlson</name>
+        <interest>programming</interest>
+        <category>2233</category>
+        <agent>
+            <firstname>Ernest</firstname>
+            <lastname>Echo</lastname>
+            <priority>3.8</priority>
+            <info rating="5.33" type="321" name="George Gregory"/>
+        </agent>
+        <description>A very happy programmer</description>
+        <email>charles@happyprogrammers.com</email>
+        <elposint>14</elposint>
+        <elnonposint>0</elnonposint>
+        <elnegint>-12</elnegint>
+        <elnonnegint>4</elnonnegint>
+        <eldate>2005-04-26</eldate>
+        <eldatetime>2005-04-26T10:11:12</eldatetime>
+        <eltoken>aa bb cc dd</eltoken>
+        <elshort>123</elshort>
+        <ellong>13241234123412341234</ellong>
+        <elparam semantic="a big semantic" name="Davy" id="id001"/>
+    </programmer>
+    <python-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info rating="6.55" type="543" name="Harvey Hippolite"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </python-programmer>
+    <java-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info rating="6.55" type="543" name="Harvey Hippolite"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </java-programmer>
+</people>
diff --git a/tests/prefix_classname1_sub.py b/tests/prefix_classname1_sub.py
new file mode 100644
index 0000000..a196947
--- /dev/null
+++ b/tests/prefix_classname1_sub.py
@@ -0,0 +1,292 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+
+import prefix_classname2_sup as supermod
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class tomato_peopleSub(supermod.tomato_people):
+    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        super(tomato_peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, )
+supermod.tomato_people.subclass = tomato_peopleSub
+# end class tomato_peopleSub
+
+
+class tomato_commentsSub(supermod.tomato_comments):
+    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        super(tomato_commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, )
+supermod.tomato_comments.subclass = tomato_commentsSub
+# end class tomato_commentsSub
+
+
+class tomato_personSub(supermod.tomato_person):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        super(tomato_personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+supermod.tomato_person.subclass = tomato_personSub
+# end class tomato_personSub
+
+
+class tomato_programmerSub(supermod.tomato_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(tomato_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+supermod.tomato_programmer.subclass = tomato_programmerSub
+# end class tomato_programmerSub
+
+
+class tomato_paramSub(supermod.tomato_param):
+    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        super(tomato_paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
+supermod.tomato_param.subclass = tomato_paramSub
+# end class tomato_paramSub
+
+
+class tomato_python_programmerSub(supermod.tomato_python_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        super(tomato_python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
+supermod.tomato_python_programmer.subclass = tomato_python_programmerSub
+# end class tomato_python_programmerSub
+
+
+class tomato_java_programmerSub(supermod.tomato_java_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        super(tomato_java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
+supermod.tomato_java_programmer.subclass = tomato_java_programmerSub
+# end class tomato_java_programmerSub
+
+
+class tomato_agentSub(supermod.tomato_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_agent.subclass = tomato_agentSub
+# end class tomato_agentSub
+
+
+class tomato_special_agentSub(supermod.tomato_special_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_special_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_special_agent.subclass = tomato_special_agentSub
+# end class tomato_special_agentSub
+
+
+class tomato_boosterSub(supermod.tomato_booster):
+    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        super(tomato_boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, )
+supermod.tomato_booster.subclass = tomato_boosterSub
+# end class tomato_boosterSub
+
+
+class tomato_infoSub(supermod.tomato_info):
+    def __init__(self, rating=None, type_=None, name=None):
+        super(tomato_infoSub, self).__init__(rating, type_, name, )
+supermod.tomato_info.subclass = tomato_infoSub
+# end class tomato_infoSub
+
+
+class tomato_client_handlerTypeSub(supermod.tomato_client_handlerType):
+    def __init__(self, fullname=None, refid=None):
+        super(tomato_client_handlerTypeSub, self).__init__(fullname, refid, )
+supermod.tomato_client_handlerType.subclass = tomato_client_handlerTypeSub
+# end class tomato_client_handlerTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
new file mode 100644
index 0000000..5f2ebd0
--- /dev/null
+++ b/tests/prefix_classname1_sup.py
@@ -0,0 +1,2897 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError, exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return input_data
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_float_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return input_data
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_double_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return input_data
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return input_data
+        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    if XMLParser_import_library == XMLParser_import_lxml:
+        msg = '%s (element %s/line %d)' % (
+            msg, node.tag, node.sourceline, )
+    else:
+        msg = '%s (element %s)' % (msg, node.tag, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(outfile, level, namespace, name, pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class tomato_people(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('comments', 'comments', 1),
+        MemberSpec_('person', 'person', 1),
+        MemberSpec_('programmer', 'programmer', 1),
+        MemberSpec_('python_programmer', 'python-programmer', 1),
+        MemberSpec_('java_programmer', 'java-programmer', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
+        if comments is None:
+            self.comments = []
+        else:
+            self.comments = comments
+        if person is None:
+            self.person = []
+        else:
+            self.person = person
+        if programmer is None:
+            self.programmer = []
+        else:
+            self.programmer = programmer
+        if python_programmer is None:
+            self.python_programmer = []
+        else:
+            self.python_programmer = python_programmer
+        if java_programmer is None:
+            self.java_programmer = []
+        else:
+            self.java_programmer = java_programmer
+    def factory(*args_, **kwargs_):
+        if tomato_people.subclass:
+            return tomato_people.subclass(*args_, **kwargs_)
+        else:
+            return tomato_people(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_comments(self): return self.comments
+    def set_comments(self, comments): self.comments = comments
+    def add_comments(self, value): self.comments.append(value)
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
+    def get_person(self): return self.person
+    def set_person(self, person): self.person = person
+    def add_person(self, value): self.person.append(value)
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
+    def get_programmer(self): return self.programmer
+    def set_programmer(self, programmer): self.programmer = programmer
+    def add_programmer(self, value): self.programmer.append(value)
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
+    def get_python_programmer(self): return self.python_programmer
+    def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
+    def add_python_programmer(self, value): self.python_programmer.append(value)
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
+    def get_java_programmer(self): return self.java_programmer
+    def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
+    def add_java_programmer(self, value): self.java_programmer.append(value)
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
+    def hasContent_(self):
+        if (
+            self.comments or
+            self.person or
+            self.programmer or
+            self.python_programmer or
+            self.java_programmer
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='people'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='people', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for comments_ in self.comments:
+            comments_.export(outfile, level, namespace_, name_='comments', pretty_print=pretty_print)
+        for person_ in self.person:
+            person_.export(outfile, level, namespace_, name_='person', pretty_print=pretty_print)
+        for programmer_ in self.programmer:
+            programmer_.export(outfile, level, namespace_, name_='programmer', pretty_print=pretty_print)
+        for python_programmer_ in self.python_programmer:
+            python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
+        for java_programmer_ in self.java_programmer:
+            java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='people'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('comments=[\n')
+        level += 1
+        for comments_ in self.comments:
+            showIndent(outfile, level)
+            outfile.write('model_.comments(\n')
+            comments_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('person=[\n')
+        level += 1
+        for person_ in self.person:
+            showIndent(outfile, level)
+            outfile.write('model_.person(\n')
+            person_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('programmer=[\n')
+        level += 1
+        for programmer_ in self.programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.programmer(\n')
+            programmer_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('python_programmer=[\n')
+        level += 1
+        for python_programmer_ in self.python_programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.python_programmer(\n')
+            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('java_programmer=[\n')
+        level += 1
+        for java_programmer_ in self.java_programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.java_programmer(\n')
+            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'comments':
+            obj_ = tomato_comments.factory()
+            obj_.build(child_)
+            self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
+        elif nodeName_ == 'person':
+            class_obj_ = self.get_class_obj_(child_, tomato_person)
+            obj_ = class_obj_.factory()
+            obj_.build(child_)
+            self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
+        elif nodeName_ == 'programmer':
+            class_obj_ = self.get_class_obj_(child_, tomato_programmer)
+            obj_ = class_obj_.factory()
+            obj_.build(child_)
+            self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
+        elif nodeName_ == 'python-programmer':
+            obj_ = tomato_python_programmer.factory()
+            obj_.build(child_)
+            self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
+        elif nodeName_ == 'java-programmer':
+            obj_ = tomato_java_programmer.factory()
+            obj_.build(child_)
+            self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
+# end class tomato_people
+
+
+class tomato_comments(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('emp', 'xs:string', 1),
+        MemberSpec_('valueOf_', [], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
+        if emp is None:
+            self.emp = []
+        else:
+            self.emp = emp
+        self.valueOf_ = valueOf_
+        if mixedclass_ is None:
+            self.mixedclass_ = MixedContainer
+        else:
+            self.mixedclass_ = mixedclass_
+        if content_ is None:
+            self.content_ = []
+        else:
+            self.content_ = content_
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if tomato_comments.subclass:
+            return tomato_comments.subclass(*args_, **kwargs_)
+        else:
+            return tomato_comments(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_emp(self): return self.emp
+    def set_emp(self, emp): self.emp = emp
+    def add_emp(self, value): self.emp.append(value)
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            self.emp or
+            self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='comments'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='comments', fromsubclass_=False, pretty_print=True):
+        if not fromsubclass_:
+            for item_ in self.content_:
+                item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='comments'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('content_ = [\n')
+        for item_ in self.content_:
+            item_.exportLiteral(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        if node.text is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', node.text)
+            self.content_.append(obj_)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'emp' and child_.text is not None:
+            valuestr_ = child_.text
+            obj_ = self.mixedclass_(MixedContainer.CategorySimple,
+                MixedContainer.TypeString, 'emp', valuestr_)
+            self.content_.append(obj_)
+        if not fromsubclass_ and child_.tail is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', child_.tail)
+            self.content_.append(obj_)
+# end class tomato_comments
+
+
+class tomato_person(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('vegetable', 'xs:string', 0),
+        MemberSpec_('fruit', 'xs:string', 0),
+        MemberSpec_('ratio', 'xs:float', 0),
+        MemberSpec_('id', 'xs:integer', 0),
+        MemberSpec_('value', 'xs:string', 0),
+        MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('interest', 'xs:string', 1),
+        MemberSpec_('category', 'xs:integer', 0),
+        MemberSpec_('agent', 'agent', 1),
+        MemberSpec_('promoter', 'booster', 1),
+        MemberSpec_('description', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
+        self.vegetable = _cast(None, vegetable)
+        self.fruit = _cast(None, fruit)
+        self.ratio = _cast(float, ratio)
+        self.id = _cast(int, id)
+        self.value = _cast(None, value)
+        self.name = name
+        if interest is None:
+            self.interest = []
+        else:
+            self.interest = interest
+        self.category = category
+        if agent is None:
+            self.agent = []
+        else:
+            self.agent = agent
+        if promoter is None:
+            self.promoter = []
+        else:
+            self.promoter = promoter
+        self.description = description
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if tomato_person.subclass:
+            return tomato_person.subclass(*args_, **kwargs_)
+        else:
+            return tomato_person(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_interest(self): return self.interest
+    def set_interest(self, interest): self.interest = interest
+    def add_interest(self, value): self.interest.append(value)
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
+    def get_category(self): return self.category
+    def set_category(self, category): self.category = category
+    def get_agent(self): return self.agent
+    def set_agent(self, agent): self.agent = agent
+    def add_agent(self, value): self.agent.append(value)
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
+    def get_promoter(self): return self.promoter
+    def set_promoter(self, promoter): self.promoter = promoter
+    def add_promoter(self, value): self.promoter.append(value)
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
+    def get_description(self): return self.description
+    def set_description(self, description): self.description = description
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_value(self): return self.value
+    def set_value(self, value): self.value = value
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def hasContent_(self):
+        if (
+            self.name is not None or
+            self.interest or
+            self.category is not None or
+            self.agent or
+            self.promoter or
+            self.description is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='person', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+        for interest_ in self.interest:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
+        if self.category is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
+        for agent_ in self.agent:
+            agent_.export(outfile, level, namespace_, name_='agent', pretty_print=pretty_print)
+        for promoter_ in self.promoter:
+            promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
+        if self.description is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='person'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            showIndent(outfile, level)
+            outfile.write('vegetable="%s",\n' % (self.vegetable,))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            showIndent(outfile, level)
+            outfile.write('fruit="%s",\n' % (self.fruit,))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            showIndent(outfile, level)
+            outfile.write('ratio=%f,\n' % (self.ratio,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            showIndent(outfile, level)
+            outfile.write('id=%d,\n' % (self.id,))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            showIndent(outfile, level)
+            outfile.write('value="%s",\n' % (self.value,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.name is not None:
+            showIndent(outfile, level)
+            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
+        showIndent(outfile, level)
+        outfile.write('interest=[\n')
+        level += 1
+        for interest_ in self.interest:
+            showIndent(outfile, level)
+            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        if self.category is not None:
+            showIndent(outfile, level)
+            outfile.write('category=%d,\n' % self.category)
+        showIndent(outfile, level)
+        outfile.write('agent=[\n')
+        level += 1
+        for agent_ in self.agent:
+            showIndent(outfile, level)
+            outfile.write('model_.agent(\n')
+            agent_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('promoter=[\n')
+        level += 1
+        for promoter_ in self.promoter:
+            showIndent(outfile, level)
+            outfile.write('model_.booster(\n')
+            promoter_.exportLiteral(outfile, level, name_='booster')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        if self.description is not None:
+            showIndent(outfile, level)
+            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError, exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            try:
+                self.id = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'name':
+            name_ = child_.text
+            name_ = self.gds_validate_string(name_, node, 'name')
+            self.name = name_
+        elif nodeName_ == 'interest':
+            interest_ = child_.text
+            interest_ = self.gds_validate_string(interest_, node, 'interest')
+            self.interest.append(interest_)
+        elif nodeName_ == 'category':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'category')
+            self.category = ival_
+        elif nodeName_ == 'agent':
+            obj_ = tomato_agent.factory()
+            obj_.build(child_)
+            self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
+        elif nodeName_ == 'promoter':
+            obj_ = tomato_booster.factory()
+            obj_.build(child_)
+            self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
+        elif nodeName_ == 'description':
+            description_ = child_.text
+            description_ = self.gds_validate_string(description_, node, 'description')
+            self.description = description_
+# end class tomato_person
+
+
+class tomato_programmer(tomato_person):
+    member_data_items_ = [
+        MemberSpec_('language', 'xs:string', 0),
+        MemberSpec_('area', 'xs:string', 0),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
+        MemberSpec_('email', 'xs:string', 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
+        MemberSpec_('eldate', 'xs:date', 0),
+        MemberSpec_('eldatetime', 'xs:dateTime', 0),
+        MemberSpec_('eltoken', 'xs:token', 0),
+        MemberSpec_('elshort', 'xs:short', 0),
+        MemberSpec_('ellong', 'xs:long', 0),
+        MemberSpec_('elparam', 'param', 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+    ]
+    subclass = None
+    superclass = tomato_person
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(tomato_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+        self.language = _cast(None, language)
+        self.area = _cast(None, area)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrposint = _cast(int, attrposint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
+        self.attrnonposint = _cast(int, attrnonposint)
+        self.email = email
+        self.elposint = elposint
+        self.elnonposint = elnonposint
+        self.elnegint = elnegint
+        self.elnonnegint = elnonnegint
+        if isinstance(eldate, basestring):
+            initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = eldate
+        self.eldate = initvalue_
+        if isinstance(eldatetime, basestring):
+            initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = eldatetime
+        self.eldatetime = initvalue_
+        self.eltoken = eltoken
+        self.elshort = elshort
+        self.ellong = ellong
+        self.elparam = elparam
+        self.elarraytypes = elarraytypes
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if tomato_programmer.subclass:
+            return tomato_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_email(self): return self.email
+    def set_email(self, email): self.email = email
+    def get_elposint(self): return self.elposint
+    def set_elposint(self, elposint): self.elposint = elposint
+    def get_elnonposint(self): return self.elnonposint
+    def set_elnonposint(self, elnonposint): self.elnonposint = elnonposint
+    def get_elnegint(self): return self.elnegint
+    def set_elnegint(self, elnegint): self.elnegint = elnegint
+    def get_elnonnegint(self): return self.elnonnegint
+    def set_elnonnegint(self, elnonnegint): self.elnonnegint = elnonnegint
+    def get_eldate(self): return self.eldate
+    def set_eldate(self, eldate): self.eldate = eldate
+    def get_eldatetime(self): return self.eldatetime
+    def set_eldatetime(self, eldatetime): self.eldatetime = eldatetime
+    def get_eltoken(self): return self.eltoken
+    def set_eltoken(self, eltoken): self.eltoken = eltoken
+    def get_elshort(self): return self.elshort
+    def set_elshort(self, elshort): self.elshort = elshort
+    def get_ellong(self): return self.ellong
+    def set_ellong(self, ellong): self.ellong = ellong
+    def get_elparam(self): return self.elparam
+    def set_elparam(self, elparam): self.elparam = elparam
+    def get_elarraytypes(self): return self.elarraytypes
+    def set_elarraytypes(self, elarraytypes): self.elarraytypes = elarraytypes
+    def get_language(self): return self.language
+    def set_language(self, language): self.language = language
+    def get_area(self): return self.area
+    def set_area(self, area): self.area = area
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrposint(self): return self.attrposint
+    def set_attrposint(self, attrposint): self.attrposint = attrposint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
+    def get_attrnonposint(self): return self.attrnonposint
+    def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def validate_ArrayTypes(self, value):
+        # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
+        pass
+    def hasContent_(self):
+        if (
+            self.email is not None or
+            self.elposint is not None or
+            self.elnonposint is not None or
+            self.elnegint is not None or
+            self.elnonnegint is not None or
+            self.eldate is not None or
+            self.eldatetime is not None or
+            self.eltoken is not None or
+            self.elshort is not None or
+            self.ellong is not None or
+            self.elparam is not None or
+            self.elarraytypes is not None or
+            super(tomato_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'):
+        super(tomato_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+        if self.language is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+        if self.area is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrposint is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
+        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.email is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
+        if self.elposint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
+        if self.elnonposint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnonposint>%s</%selnonposint>%s' % (namespace_, self.gds_format_integer(self.elnonposint, input_name='elnonposint'), namespace_, eol_))
+        if self.elnegint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnegint>%s</%selnegint>%s' % (namespace_, self.gds_format_integer(self.elnegint, input_name='elnegint'), namespace_, eol_))
+        if self.elnonnegint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnonnegint>%s</%selnonnegint>%s' % (namespace_, self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), namespace_, eol_))
+        if self.eldate is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_))
+        if self.eldatetime is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_))
+        if self.eltoken is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
+        if self.elshort is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
+        if self.ellong is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sellong>%s</%sellong>%s' % (namespace_, self.gds_format_integer(self.ellong, input_name='ellong'), namespace_, eol_))
+        if self.elparam is not None:
+            self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
+        if self.elarraytypes is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.language is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            showIndent(outfile, level)
+            outfile.write('language="%s",\n' % (self.language,))
+        if self.area is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            showIndent(outfile, level)
+            outfile.write('area="%s",\n' % (self.area,))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
+        if self.attrposint is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            showIndent(outfile, level)
+            outfile.write('attrposint=%d,\n' % (self.attrposint,))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
+        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            showIndent(outfile, level)
+            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
+        super(tomato_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.email is not None:
+            showIndent(outfile, level)
+            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
+        if self.elposint is not None:
+            showIndent(outfile, level)
+            outfile.write('elposint=%d,\n' % self.elposint)
+        if self.elnonposint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnonposint=%d,\n' % self.elnonposint)
+        if self.elnegint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnegint=%d,\n' % self.elnegint)
+        if self.elnonnegint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
+        if self.eldate is not None:
+            showIndent(outfile, level)
+            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
+        if self.eldatetime is not None:
+            showIndent(outfile, level)
+            outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime'))
+        if self.eltoken is not None:
+            showIndent(outfile, level)
+            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
+        if self.elshort is not None:
+            showIndent(outfile, level)
+            outfile.write('elshort=%d,\n' % self.elshort)
+        if self.ellong is not None:
+            showIndent(outfile, level)
+            outfile.write('ellong=%d,\n' % self.ellong)
+        if self.elparam is not None:
+            showIndent(outfile, level)
+            outfile.write('elparam=model_.param(\n')
+            self.elparam.exportLiteral(outfile, level, name_='elparam')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        if self.elarraytypes is not None:
+            showIndent(outfile, level)
+            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('language', node)
+        if value is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            self.language = value
+        value = find_attr_value_('area', node)
+        if value is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            self.area = value
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrposint', node)
+        if value is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            try:
+                self.attrposint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrposint <= 0:
+                raise_parse_error(node, 'Invalid PositiveInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
+        value = find_attr_value_('attrnonposint', node)
+        if value is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            try:
+                self.attrnonposint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonposint > 0:
+                raise_parse_error(node, 'Invalid NonPositiveInteger')
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+        super(tomato_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'email':
+            email_ = child_.text
+            email_ = self.gds_validate_string(email_, node, 'email')
+            self.email = email_
+        elif nodeName_ == 'elposint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ <= 0:
+                raise_parse_error(child_, 'requires positiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elposint')
+            self.elposint = ival_
+        elif nodeName_ == 'elnonposint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ > 0:
+                raise_parse_error(child_, 'requires nonPositiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonposint')
+            self.elnonposint = ival_
+        elif nodeName_ == 'elnegint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ >= 0:
+                raise_parse_error(child_, 'requires negativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnegint')
+            self.elnegint = ival_
+        elif nodeName_ == 'elnonnegint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ < 0:
+                raise_parse_error(child_, 'requires nonNegativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonnegint')
+            self.elnonnegint = ival_
+        elif nodeName_ == 'eldate':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.eldate = dval_
+        elif nodeName_ == 'eldatetime':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.eldatetime = dval_
+        elif nodeName_ == 'eltoken':
+            eltoken_ = child_.text
+            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
+            self.eltoken = eltoken_
+        elif nodeName_ == 'elshort':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'elshort')
+            self.elshort = ival_
+        elif nodeName_ == 'ellong':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'ellong')
+            self.ellong = ival_
+        elif nodeName_ == 'elparam':
+            obj_ = tomato_param.factory()
+            obj_.build(child_)
+            self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
+        elif nodeName_ == 'elarraytypes':
+            elarraytypes_ = child_.text
+            elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
+            self.elarraytypes = elarraytypes_
+            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
+        super(tomato_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_programmer
+
+
+class tomato_param(GeneratedsSuper):
+    """Finding flow attribute unneccesary in practice. A unnamed parameter
+    is unbound/skipped."""
+    member_data_items_ = [
+        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('name', 'xs:NCName', 0),
+        MemberSpec_('flow', 'FlowType', 0),
+        MemberSpec_('sid', 'xs:NCName', 0),
+        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0),
+        MemberSpec_('valueOf_', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.semantic = _cast(None, semantic)
+        self.name = _cast(None, name)
+        self.flow = _cast(None, flow)
+        self.sid = _cast(None, sid)
+        self.type_ = _cast(None, type_)
+        self.id = _cast(None, id)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if tomato_param.subclass:
+            return tomato_param.subclass(*args_, **kwargs_)
+        else:
+            return tomato_param(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_sid(self): return self.sid
+    def set_sid(self, sid): self.sid = sid
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (quote_attrib(self.name), ))
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
+        pass
+    def exportLiteral(self, outfile, level, name_='param'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            showIndent(outfile, level)
+            outfile.write('semantic="%s",\n' % (self.semantic,))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            showIndent(outfile, level)
+            outfile.write('name="%s",\n' % (self.name,))
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            showIndent(outfile, level)
+            outfile.write('flow=%s,\n' % (self.flow,))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            showIndent(outfile, level)
+            outfile.write('sid="%s",\n' % (self.sid,))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            showIndent(outfile, level)
+            outfile.write('type_="%s",\n' % (self.type_,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            showIndent(outfile, level)
+            outfile.write('id="%s",\n' % (self.id,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('flow', node)
+        if value is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            self.flow = value
+        value = find_attr_value_('sid', node)
+        if value is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            self.sid = value
+        value = find_attr_value_('type', node)
+        if value is not None and 'type' not in already_processed:
+            already_processed.add('type')
+            self.type_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class tomato_param
+
+
+class tomato_python_programmer(tomato_programmer):
+    member_data_items_ = [
+        MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('favorite_editor', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = tomato_programmer
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+        self.nick_name = _cast(None, nick_name)
+        self.favorite_editor = favorite_editor
+    def factory(*args_, **kwargs_):
+        if tomato_python_programmer.subclass:
+            return tomato_python_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_python_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_favorite_editor(self): return self.favorite_editor
+    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
+    def get_nick_name(self): return self.nick_name
+    def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def hasContent_(self):
+        if (
+            self.favorite_editor is not None or
+            super(tomato_python_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'):
+        super(tomato_python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='python-programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        super(tomato_python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_python_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.favorite_editor is not None:
+            showIndent(outfile, level)
+            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('nick-name', node)
+        if value is not None and 'nick-name' not in already_processed:
+            already_processed.add('nick-name')
+            self.nick_name = value
+        super(tomato_python_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'favorite-editor':
+            favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
+            self.favorite_editor = favorite_editor_
+        super(tomato_python_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_python_programmer
+
+
+class tomato_java_programmer(tomato_programmer):
+    member_data_items_ = [
+        MemberSpec_('status', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('favorite_editor', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = tomato_programmer
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+        self.status = _cast(None, status)
+        self.nick_name = _cast(None, nick_name)
+        self.favorite_editor = favorite_editor
+    def factory(*args_, **kwargs_):
+        if tomato_java_programmer.subclass:
+            return tomato_java_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_java_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_favorite_editor(self): return self.favorite_editor
+    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
+    def get_nick_name(self): return self.nick_name
+    def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def hasContent_(self):
+        if (
+            self.favorite_editor is not None or
+            super(tomato_java_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
+        super(tomato_java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='java-programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            showIndent(outfile, level)
+            outfile.write('status="%s",\n' % (self.status,))
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        super(tomato_java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_java_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.favorite_editor is not None:
+            showIndent(outfile, level)
+            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
+        value = find_attr_value_('nick-name', node)
+        if value is not None and 'nick-name' not in already_processed:
+            already_processed.add('nick-name')
+            self.nick_name = value
+        super(tomato_java_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'favorite-editor':
+            favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
+            self.favorite_editor = favorite_editor_
+        super(tomato_java_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_java_programmer
+
+
+class tomato_agent(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('priority', 'xs:float', 0),
+        MemberSpec_('info', 'info', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.priority = priority
+        self.info = info
+    def factory(*args_, **kwargs_):
+        if tomato_agent.subclass:
+            return tomato_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_agent(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    def get_info(self): return self.info
+    def set_info(self, info): self.info = info
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.priority is not None or
+            self.info is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='agent'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='agent', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='agent'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.priority is not None:
+            showIndent(outfile, level)
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.info is not None:
+            showIndent(outfile, level)
+            outfile.write('info=model_.info(\n')
+            self.info.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'info':
+            obj_ = tomato_info.factory()
+            obj_.build(child_)
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+# end class tomato_agent
+
+
+class tomato_special_agent(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('priority', 'xs:float', 0),
+        MemberSpec_('info', 'info', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.priority = priority
+        self.info = info
+    def factory(*args_, **kwargs_):
+        if tomato_special_agent.subclass:
+            return tomato_special_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_special_agent(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    def get_info(self): return self.info
+    def set_info(self, info): self.info = info
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.priority is not None or
+            self.info is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agent'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='special-agent', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='special-agent'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.priority is not None:
+            showIndent(outfile, level)
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.info is not None:
+            showIndent(outfile, level)
+            outfile.write('info=model_.info(\n')
+            self.info.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'info':
+            obj_ = tomato_info.factory()
+            obj_.build(child_)
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+# end class tomato_special_agent
+
+
+class tomato_booster(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('other_name', 'xs:float', 0),
+        MemberSpec_('class_', 'xs:float', 0),
+        MemberSpec_('other_value', 'xs:float', 1),
+        MemberSpec_('type_', 'xs:float', 1),
+        MemberSpec_('client_handler', 'client-handlerType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.other_name = other_name
+        self.class_ = class_
+        if other_value is None:
+            self.other_value = []
+        else:
+            self.other_value = other_value
+        if type_ is None:
+            self.type_ = []
+        else:
+            self.type_ = type_
+        if client_handler is None:
+            self.client_handler = []
+        else:
+            self.client_handler = client_handler
+    def factory(*args_, **kwargs_):
+        if tomato_booster.subclass:
+            return tomato_booster.subclass(*args_, **kwargs_)
+        else:
+            return tomato_booster(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_other_name(self): return self.other_name
+    def set_other_name(self, other_name): self.other_name = other_name
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_other_value(self): return self.other_value
+    def set_other_value(self, other_value): self.other_value = other_value
+    def add_other_value(self, value): self.other_value.append(value)
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def add_type(self, value): self.type_.append(value)
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
+    def get_client_handler(self): return self.client_handler
+    def set_client_handler(self, client_handler): self.client_handler = client_handler
+    def add_client_handler(self, value): self.client_handler.append(value)
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.other_name is not None or
+            self.class_ is not None or
+            self.other_value or
+            self.type_ or
+            self.client_handler
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.other_name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
+        if self.class_ is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sclass>%s</%sclass>%s' % (namespace_, self.gds_format_float(self.class_, input_name='class'), namespace_, eol_))
+        for other_value_ in self.other_value:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sother-value>%s</%sother-value>%s' % (namespace_, self.gds_format_float(other_value_, input_name='other-value'), namespace_, eol_))
+        for type_ in self.type_:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_))
+        for client_handler_ in self.client_handler:
+            client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='booster'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.other_name is not None:
+            showIndent(outfile, level)
+            outfile.write('other_name=%f,\n' % self.other_name)
+        if self.class_ is not None:
+            showIndent(outfile, level)
+            outfile.write('class_=%f,\n' % self.class_)
+        showIndent(outfile, level)
+        outfile.write('other_value=[\n')
+        level += 1
+        for other_value_ in self.other_value:
+            showIndent(outfile, level)
+            outfile.write('%f,\n' % other_value_)
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('type_=[\n')
+        level += 1
+        for type_ in self.type_:
+            showIndent(outfile, level)
+            outfile.write('%f,\n' % type_)
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('client_handler=[\n')
+        level += 1
+        for client_handler_ in self.client_handler:
+            showIndent(outfile, level)
+            outfile.write('model_.client_handlerType(\n')
+            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'other-name':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_name')
+            self.other_name = fval_
+        elif nodeName_ == 'class':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'class')
+            self.class_ = fval_
+        elif nodeName_ == 'other-value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_value')
+            self.other_value.append(fval_)
+        elif nodeName_ == 'type':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'type')
+            self.type_.append(fval_)
+        elif nodeName_ == 'client-handler':
+            obj_ = tomato_client_handlerType.factory()
+            obj_.build(child_)
+            self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
+# end class tomato_booster
+
+
+class tomato_info(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('name', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
+        self.rating = _cast(float, rating)
+        self.type_ = _cast(int, type_)
+        self.name = _cast(None, name)
+    def factory(*args_, **kwargs_):
+        if tomato_info.subclass:
+            return tomato_info.subclass(*args_, **kwargs_)
+        else:
+            return tomato_info(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
+        pass
+    def exportLiteral(self, outfile, level, name_='info'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            showIndent(outfile, level)
+            outfile.write('rating=%f,\n' % (self.rating,))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            showIndent(outfile, level)
+            outfile.write('type_=%d,\n' % (self.type_,))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            showIndent(outfile, level)
+            outfile.write('name="%s",\n' % (self.name,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError, exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('type', node)
+        if value is not None and 'type' not in already_processed:
+            already_processed.add('type')
+            try:
+                self.type_ = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class tomato_info
+
+
+class tomato_client_handlerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('fullname', 'xs:string', 0),
+        MemberSpec_('refid', 'xs:integer', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
+        self.fullname = fullname
+        self.refid = refid
+    def factory(*args_, **kwargs_):
+        if tomato_client_handlerType.subclass:
+            return tomato_client_handlerType.subclass(*args_, **kwargs_)
+        else:
+            return tomato_client_handlerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_fullname(self): return self.fullname
+    def set_fullname(self, fullname): self.fullname = fullname
+    def get_refid(self): return self.refid
+    def set_refid(self, refid): self.refid = refid
+    def hasContent_(self):
+        if (
+            self.fullname is not None or
+            self.refid is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='client-handlerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='client-handlerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.fullname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
+        if self.refid is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='client-handlerType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.fullname is not None:
+            showIndent(outfile, level)
+            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
+        if self.refid is not None:
+            showIndent(outfile, level)
+            outfile.write('refid=%d,\n' % self.refid)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'fullname':
+            fullname_ = child_.text
+            fullname_ = self.gds_validate_string(fullname_, node, 'fullname')
+            self.fullname = fullname_
+        elif nodeName_ == 'refid':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'refid')
+            self.refid = ival_
+# end class tomato_client_handlerType
+
+
+GDSClassesMapping = {
+    'client-handler': tomato_client_handlerType,
+    'elparam': tomato_param,
+    'promoter': tomato_booster,
+}
+
+
+USAGE_TEXT = """
+Usage: python <tomato_Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "tomato_agent",
+    "tomato_booster",
+    "tomato_client_handlerType",
+    "tomato_comments",
+    "tomato_info",
+    "tomato_java_programmer",
+    "tomato_param",
+    "tomato_people",
+    "tomato_person",
+    "tomato_programmer",
+    "tomato_python_programmer",
+    "tomato_special_agent"
+]
diff --git a/tests/prefix_classname2_out.xml b/tests/prefix_classname2_out.xml
new file mode 100644
index 0000000..c2e2e7e
--- /dev/null
+++ b/tests/prefix_classname2_out.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" ?>
+<people>
+    <comments>
+1. This is a <emp>foolish</emp> comment.  It is <emp>really</emp> important.    </comments>
+    <comments>
+2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.    </comments>
+    <person ratio="3.2" id="1" value="abcd">
+        <name>Alberta</name>
+        <interest>gardening</interest>
+        <interest>reading</interest>
+        <category>5</category>
+    </person>
+    <person id="2">
+        <name>Bernardo</name>
+        <interest>programming</interest>
+        <category>0</category>
+        <agent>
+            <firstname>Darren</firstname>
+            <lastname>Diddly</lastname>
+            <priority>4.5</priority>
+            <info rating="5.33" type="321" name="Albert Abasinian"/>
+        </agent>
+    </person>
+    <person id="3">
+        <name>Charlie</name>
+        <interest>people</interest>
+        <interest>cats</interest>
+        <interest>dogs</interest>
+        <category>8</category>
+        <promoter>
+            <firstname>David</firstname>
+            <lastname>Donaldson</lastname>
+        </promoter>
+        <promoter>
+            <firstname>Edward</firstname>
+            <lastname>Eddleberry</lastname>
+        </promoter>
+    </person>
+    <person id="4"/>
+    <programmer id="2" language="python" area="xml">
+        <name>Charles Carlson</name>
+        <interest>programming</interest>
+        <category>2233</category>
+        <agent>
+            <firstname>Ernest</firstname>
+            <lastname>Echo</lastname>
+            <priority>3.8</priority>
+            <info rating="5.33" type="321" name="George Gregory"/>
+        </agent>
+        <description>A very happy programmer</description>
+        <email>charles@happyprogrammers.com</email>
+        <elposint>14</elposint>
+        <elnonposint>0</elnonposint>
+        <elnegint>-12</elnegint>
+        <elnonnegint>4</elnonnegint>
+        <eldate>2005-04-26</eldate>
+        <eldatetime>2005-04-26T10:11:12</eldatetime>
+        <eltoken>aa bb cc dd</eltoken>
+        <elshort>123</elshort>
+        <ellong>13241234123412341234</ellong>
+        <elparam semantic="a big semantic" name="Davy" id="id001"/>
+    </programmer>
+    <python-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info rating="6.55" type="543" name="Harvey Hippolite"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </python-programmer>
+    <java-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info rating="6.55" type="543" name="Harvey Hippolite"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </java-programmer>
+</people>
diff --git a/tests/prefix_classname2_sub.py b/tests/prefix_classname2_sub.py
new file mode 100644
index 0000000..a196947
--- /dev/null
+++ b/tests/prefix_classname2_sub.py
@@ -0,0 +1,292 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+
+import prefix_classname2_sup as supermod
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class tomato_peopleSub(supermod.tomato_people):
+    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        super(tomato_peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, )
+supermod.tomato_people.subclass = tomato_peopleSub
+# end class tomato_peopleSub
+
+
+class tomato_commentsSub(supermod.tomato_comments):
+    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        super(tomato_commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, )
+supermod.tomato_comments.subclass = tomato_commentsSub
+# end class tomato_commentsSub
+
+
+class tomato_personSub(supermod.tomato_person):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        super(tomato_personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+supermod.tomato_person.subclass = tomato_personSub
+# end class tomato_personSub
+
+
+class tomato_programmerSub(supermod.tomato_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(tomato_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+supermod.tomato_programmer.subclass = tomato_programmerSub
+# end class tomato_programmerSub
+
+
+class tomato_paramSub(supermod.tomato_param):
+    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        super(tomato_paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
+supermod.tomato_param.subclass = tomato_paramSub
+# end class tomato_paramSub
+
+
+class tomato_python_programmerSub(supermod.tomato_python_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        super(tomato_python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
+supermod.tomato_python_programmer.subclass = tomato_python_programmerSub
+# end class tomato_python_programmerSub
+
+
+class tomato_java_programmerSub(supermod.tomato_java_programmer):
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        super(tomato_java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
+supermod.tomato_java_programmer.subclass = tomato_java_programmerSub
+# end class tomato_java_programmerSub
+
+
+class tomato_agentSub(supermod.tomato_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_agent.subclass = tomato_agentSub
+# end class tomato_agentSub
+
+
+class tomato_special_agentSub(supermod.tomato_special_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_special_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_special_agent.subclass = tomato_special_agentSub
+# end class tomato_special_agentSub
+
+
+class tomato_boosterSub(supermod.tomato_booster):
+    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        super(tomato_boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, )
+supermod.tomato_booster.subclass = tomato_boosterSub
+# end class tomato_boosterSub
+
+
+class tomato_infoSub(supermod.tomato_info):
+    def __init__(self, rating=None, type_=None, name=None):
+        super(tomato_infoSub, self).__init__(rating, type_, name, )
+supermod.tomato_info.subclass = tomato_infoSub
+# end class tomato_infoSub
+
+
+class tomato_client_handlerTypeSub(supermod.tomato_client_handlerType):
+    def __init__(self, fullname=None, refid=None):
+        super(tomato_client_handlerTypeSub, self).__init__(fullname, refid, )
+supermod.tomato_client_handlerType.subclass = tomato_client_handlerTypeSub
+# end class tomato_client_handlerTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/prefix_classname2_sup.py b/tests/prefix_classname2_sup.py
new file mode 100644
index 0000000..5f2ebd0
--- /dev/null
+++ b/tests/prefix_classname2_sup.py
@@ -0,0 +1,2897 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError, exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return input_data
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_float_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return input_data
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_double_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return input_data
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % input_data
+        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return input_data
+        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    if XMLParser_import_library == XMLParser_import_lxml:
+        msg = '%s (element %s/line %d)' % (
+            msg, node.tag, node.sourceline, )
+    else:
+        msg = '%s (element %s)' % (msg, node.tag, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(outfile, level, namespace, name, pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class tomato_people(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('comments', 'comments', 1),
+        MemberSpec_('person', 'person', 1),
+        MemberSpec_('programmer', 'programmer', 1),
+        MemberSpec_('python_programmer', 'python-programmer', 1),
+        MemberSpec_('java_programmer', 'java-programmer', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
+        if comments is None:
+            self.comments = []
+        else:
+            self.comments = comments
+        if person is None:
+            self.person = []
+        else:
+            self.person = person
+        if programmer is None:
+            self.programmer = []
+        else:
+            self.programmer = programmer
+        if python_programmer is None:
+            self.python_programmer = []
+        else:
+            self.python_programmer = python_programmer
+        if java_programmer is None:
+            self.java_programmer = []
+        else:
+            self.java_programmer = java_programmer
+    def factory(*args_, **kwargs_):
+        if tomato_people.subclass:
+            return tomato_people.subclass(*args_, **kwargs_)
+        else:
+            return tomato_people(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_comments(self): return self.comments
+    def set_comments(self, comments): self.comments = comments
+    def add_comments(self, value): self.comments.append(value)
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
+    def get_person(self): return self.person
+    def set_person(self, person): self.person = person
+    def add_person(self, value): self.person.append(value)
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
+    def get_programmer(self): return self.programmer
+    def set_programmer(self, programmer): self.programmer = programmer
+    def add_programmer(self, value): self.programmer.append(value)
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
+    def get_python_programmer(self): return self.python_programmer
+    def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
+    def add_python_programmer(self, value): self.python_programmer.append(value)
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
+    def get_java_programmer(self): return self.java_programmer
+    def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
+    def add_java_programmer(self, value): self.java_programmer.append(value)
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
+    def hasContent_(self):
+        if (
+            self.comments or
+            self.person or
+            self.programmer or
+            self.python_programmer or
+            self.java_programmer
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='people'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='people', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for comments_ in self.comments:
+            comments_.export(outfile, level, namespace_, name_='comments', pretty_print=pretty_print)
+        for person_ in self.person:
+            person_.export(outfile, level, namespace_, name_='person', pretty_print=pretty_print)
+        for programmer_ in self.programmer:
+            programmer_.export(outfile, level, namespace_, name_='programmer', pretty_print=pretty_print)
+        for python_programmer_ in self.python_programmer:
+            python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
+        for java_programmer_ in self.java_programmer:
+            java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='people'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('comments=[\n')
+        level += 1
+        for comments_ in self.comments:
+            showIndent(outfile, level)
+            outfile.write('model_.comments(\n')
+            comments_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('person=[\n')
+        level += 1
+        for person_ in self.person:
+            showIndent(outfile, level)
+            outfile.write('model_.person(\n')
+            person_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('programmer=[\n')
+        level += 1
+        for programmer_ in self.programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.programmer(\n')
+            programmer_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('python_programmer=[\n')
+        level += 1
+        for python_programmer_ in self.python_programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.python_programmer(\n')
+            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('java_programmer=[\n')
+        level += 1
+        for java_programmer_ in self.java_programmer:
+            showIndent(outfile, level)
+            outfile.write('model_.java_programmer(\n')
+            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'comments':
+            obj_ = tomato_comments.factory()
+            obj_.build(child_)
+            self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
+        elif nodeName_ == 'person':
+            class_obj_ = self.get_class_obj_(child_, tomato_person)
+            obj_ = class_obj_.factory()
+            obj_.build(child_)
+            self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
+        elif nodeName_ == 'programmer':
+            class_obj_ = self.get_class_obj_(child_, tomato_programmer)
+            obj_ = class_obj_.factory()
+            obj_.build(child_)
+            self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
+        elif nodeName_ == 'python-programmer':
+            obj_ = tomato_python_programmer.factory()
+            obj_.build(child_)
+            self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
+        elif nodeName_ == 'java-programmer':
+            obj_ = tomato_java_programmer.factory()
+            obj_.build(child_)
+            self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
+# end class tomato_people
+
+
+class tomato_comments(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('emp', 'xs:string', 1),
+        MemberSpec_('valueOf_', [], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
+        if emp is None:
+            self.emp = []
+        else:
+            self.emp = emp
+        self.valueOf_ = valueOf_
+        if mixedclass_ is None:
+            self.mixedclass_ = MixedContainer
+        else:
+            self.mixedclass_ = mixedclass_
+        if content_ is None:
+            self.content_ = []
+        else:
+            self.content_ = content_
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if tomato_comments.subclass:
+            return tomato_comments.subclass(*args_, **kwargs_)
+        else:
+            return tomato_comments(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_emp(self): return self.emp
+    def set_emp(self, emp): self.emp = emp
+    def add_emp(self, value): self.emp.append(value)
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            self.emp or
+            self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='comments'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='comments', fromsubclass_=False, pretty_print=True):
+        if not fromsubclass_:
+            for item_ in self.content_:
+                item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='comments'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('content_ = [\n')
+        for item_ in self.content_:
+            item_.exportLiteral(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        if node.text is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', node.text)
+            self.content_.append(obj_)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'emp' and child_.text is not None:
+            valuestr_ = child_.text
+            obj_ = self.mixedclass_(MixedContainer.CategorySimple,
+                MixedContainer.TypeString, 'emp', valuestr_)
+            self.content_.append(obj_)
+        if not fromsubclass_ and child_.tail is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', child_.tail)
+            self.content_.append(obj_)
+# end class tomato_comments
+
+
+class tomato_person(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('vegetable', 'xs:string', 0),
+        MemberSpec_('fruit', 'xs:string', 0),
+        MemberSpec_('ratio', 'xs:float', 0),
+        MemberSpec_('id', 'xs:integer', 0),
+        MemberSpec_('value', 'xs:string', 0),
+        MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('interest', 'xs:string', 1),
+        MemberSpec_('category', 'xs:integer', 0),
+        MemberSpec_('agent', 'agent', 1),
+        MemberSpec_('promoter', 'booster', 1),
+        MemberSpec_('description', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
+        self.vegetable = _cast(None, vegetable)
+        self.fruit = _cast(None, fruit)
+        self.ratio = _cast(float, ratio)
+        self.id = _cast(int, id)
+        self.value = _cast(None, value)
+        self.name = name
+        if interest is None:
+            self.interest = []
+        else:
+            self.interest = interest
+        self.category = category
+        if agent is None:
+            self.agent = []
+        else:
+            self.agent = agent
+        if promoter is None:
+            self.promoter = []
+        else:
+            self.promoter = promoter
+        self.description = description
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if tomato_person.subclass:
+            return tomato_person.subclass(*args_, **kwargs_)
+        else:
+            return tomato_person(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_interest(self): return self.interest
+    def set_interest(self, interest): self.interest = interest
+    def add_interest(self, value): self.interest.append(value)
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
+    def get_category(self): return self.category
+    def set_category(self, category): self.category = category
+    def get_agent(self): return self.agent
+    def set_agent(self, agent): self.agent = agent
+    def add_agent(self, value): self.agent.append(value)
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
+    def get_promoter(self): return self.promoter
+    def set_promoter(self, promoter): self.promoter = promoter
+    def add_promoter(self, value): self.promoter.append(value)
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
+    def get_description(self): return self.description
+    def set_description(self, description): self.description = description
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_value(self): return self.value
+    def set_value(self, value): self.value = value
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def hasContent_(self):
+        if (
+            self.name is not None or
+            self.interest or
+            self.category is not None or
+            self.agent or
+            self.promoter or
+            self.description is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='person', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+        for interest_ in self.interest:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
+        if self.category is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
+        for agent_ in self.agent:
+            agent_.export(outfile, level, namespace_, name_='agent', pretty_print=pretty_print)
+        for promoter_ in self.promoter:
+            promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
+        if self.description is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='person'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            showIndent(outfile, level)
+            outfile.write('vegetable="%s",\n' % (self.vegetable,))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            showIndent(outfile, level)
+            outfile.write('fruit="%s",\n' % (self.fruit,))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            showIndent(outfile, level)
+            outfile.write('ratio=%f,\n' % (self.ratio,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            showIndent(outfile, level)
+            outfile.write('id=%d,\n' % (self.id,))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            showIndent(outfile, level)
+            outfile.write('value="%s",\n' % (self.value,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.name is not None:
+            showIndent(outfile, level)
+            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
+        showIndent(outfile, level)
+        outfile.write('interest=[\n')
+        level += 1
+        for interest_ in self.interest:
+            showIndent(outfile, level)
+            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        if self.category is not None:
+            showIndent(outfile, level)
+            outfile.write('category=%d,\n' % self.category)
+        showIndent(outfile, level)
+        outfile.write('agent=[\n')
+        level += 1
+        for agent_ in self.agent:
+            showIndent(outfile, level)
+            outfile.write('model_.agent(\n')
+            agent_.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('promoter=[\n')
+        level += 1
+        for promoter_ in self.promoter:
+            showIndent(outfile, level)
+            outfile.write('model_.booster(\n')
+            promoter_.exportLiteral(outfile, level, name_='booster')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        if self.description is not None:
+            showIndent(outfile, level)
+            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError, exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            try:
+                self.id = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'name':
+            name_ = child_.text
+            name_ = self.gds_validate_string(name_, node, 'name')
+            self.name = name_
+        elif nodeName_ == 'interest':
+            interest_ = child_.text
+            interest_ = self.gds_validate_string(interest_, node, 'interest')
+            self.interest.append(interest_)
+        elif nodeName_ == 'category':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'category')
+            self.category = ival_
+        elif nodeName_ == 'agent':
+            obj_ = tomato_agent.factory()
+            obj_.build(child_)
+            self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
+        elif nodeName_ == 'promoter':
+            obj_ = tomato_booster.factory()
+            obj_.build(child_)
+            self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
+        elif nodeName_ == 'description':
+            description_ = child_.text
+            description_ = self.gds_validate_string(description_, node, 'description')
+            self.description = description_
+# end class tomato_person
+
+
+class tomato_programmer(tomato_person):
+    member_data_items_ = [
+        MemberSpec_('language', 'xs:string', 0),
+        MemberSpec_('area', 'xs:string', 0),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
+        MemberSpec_('email', 'xs:string', 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
+        MemberSpec_('eldate', 'xs:date', 0),
+        MemberSpec_('eldatetime', 'xs:dateTime', 0),
+        MemberSpec_('eltoken', 'xs:token', 0),
+        MemberSpec_('elshort', 'xs:short', 0),
+        MemberSpec_('ellong', 'xs:long', 0),
+        MemberSpec_('elparam', 'param', 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+    ]
+    subclass = None
+    superclass = tomato_person
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(tomato_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+        self.language = _cast(None, language)
+        self.area = _cast(None, area)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrposint = _cast(int, attrposint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
+        self.attrnonposint = _cast(int, attrnonposint)
+        self.email = email
+        self.elposint = elposint
+        self.elnonposint = elnonposint
+        self.elnegint = elnegint
+        self.elnonnegint = elnonnegint
+        if isinstance(eldate, basestring):
+            initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = eldate
+        self.eldate = initvalue_
+        if isinstance(eldatetime, basestring):
+            initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = eldatetime
+        self.eldatetime = initvalue_
+        self.eltoken = eltoken
+        self.elshort = elshort
+        self.ellong = ellong
+        self.elparam = elparam
+        self.elarraytypes = elarraytypes
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if tomato_programmer.subclass:
+            return tomato_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_email(self): return self.email
+    def set_email(self, email): self.email = email
+    def get_elposint(self): return self.elposint
+    def set_elposint(self, elposint): self.elposint = elposint
+    def get_elnonposint(self): return self.elnonposint
+    def set_elnonposint(self, elnonposint): self.elnonposint = elnonposint
+    def get_elnegint(self): return self.elnegint
+    def set_elnegint(self, elnegint): self.elnegint = elnegint
+    def get_elnonnegint(self): return self.elnonnegint
+    def set_elnonnegint(self, elnonnegint): self.elnonnegint = elnonnegint
+    def get_eldate(self): return self.eldate
+    def set_eldate(self, eldate): self.eldate = eldate
+    def get_eldatetime(self): return self.eldatetime
+    def set_eldatetime(self, eldatetime): self.eldatetime = eldatetime
+    def get_eltoken(self): return self.eltoken
+    def set_eltoken(self, eltoken): self.eltoken = eltoken
+    def get_elshort(self): return self.elshort
+    def set_elshort(self, elshort): self.elshort = elshort
+    def get_ellong(self): return self.ellong
+    def set_ellong(self, ellong): self.ellong = ellong
+    def get_elparam(self): return self.elparam
+    def set_elparam(self, elparam): self.elparam = elparam
+    def get_elarraytypes(self): return self.elarraytypes
+    def set_elarraytypes(self, elarraytypes): self.elarraytypes = elarraytypes
+    def get_language(self): return self.language
+    def set_language(self, language): self.language = language
+    def get_area(self): return self.area
+    def set_area(self, area): self.area = area
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrposint(self): return self.attrposint
+    def set_attrposint(self, attrposint): self.attrposint = attrposint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
+    def get_attrnonposint(self): return self.attrnonposint
+    def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def validate_ArrayTypes(self, value):
+        # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
+        pass
+    def hasContent_(self):
+        if (
+            self.email is not None or
+            self.elposint is not None or
+            self.elnonposint is not None or
+            self.elnegint is not None or
+            self.elnonnegint is not None or
+            self.eldate is not None or
+            self.eldatetime is not None or
+            self.eltoken is not None or
+            self.elshort is not None or
+            self.ellong is not None or
+            self.elparam is not None or
+            self.elarraytypes is not None or
+            super(tomato_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'):
+        super(tomato_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+        if self.language is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+        if self.area is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrposint is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
+        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.email is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
+        if self.elposint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
+        if self.elnonposint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnonposint>%s</%selnonposint>%s' % (namespace_, self.gds_format_integer(self.elnonposint, input_name='elnonposint'), namespace_, eol_))
+        if self.elnegint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnegint>%s</%selnegint>%s' % (namespace_, self.gds_format_integer(self.elnegint, input_name='elnegint'), namespace_, eol_))
+        if self.elnonnegint is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selnonnegint>%s</%selnonnegint>%s' % (namespace_, self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), namespace_, eol_))
+        if self.eldate is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_))
+        if self.eldatetime is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_))
+        if self.eltoken is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
+        if self.elshort is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
+        if self.ellong is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sellong>%s</%sellong>%s' % (namespace_, self.gds_format_integer(self.ellong, input_name='ellong'), namespace_, eol_))
+        if self.elparam is not None:
+            self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
+        if self.elarraytypes is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.language is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            showIndent(outfile, level)
+            outfile.write('language="%s",\n' % (self.language,))
+        if self.area is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            showIndent(outfile, level)
+            outfile.write('area="%s",\n' % (self.area,))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
+        if self.attrposint is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            showIndent(outfile, level)
+            outfile.write('attrposint=%d,\n' % (self.attrposint,))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
+        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            showIndent(outfile, level)
+            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
+        super(tomato_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.email is not None:
+            showIndent(outfile, level)
+            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
+        if self.elposint is not None:
+            showIndent(outfile, level)
+            outfile.write('elposint=%d,\n' % self.elposint)
+        if self.elnonposint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnonposint=%d,\n' % self.elnonposint)
+        if self.elnegint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnegint=%d,\n' % self.elnegint)
+        if self.elnonnegint is not None:
+            showIndent(outfile, level)
+            outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
+        if self.eldate is not None:
+            showIndent(outfile, level)
+            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
+        if self.eldatetime is not None:
+            showIndent(outfile, level)
+            outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime'))
+        if self.eltoken is not None:
+            showIndent(outfile, level)
+            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
+        if self.elshort is not None:
+            showIndent(outfile, level)
+            outfile.write('elshort=%d,\n' % self.elshort)
+        if self.ellong is not None:
+            showIndent(outfile, level)
+            outfile.write('ellong=%d,\n' % self.ellong)
+        if self.elparam is not None:
+            showIndent(outfile, level)
+            outfile.write('elparam=model_.param(\n')
+            self.elparam.exportLiteral(outfile, level, name_='elparam')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        if self.elarraytypes is not None:
+            showIndent(outfile, level)
+            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('language', node)
+        if value is not None and 'language' not in already_processed:
+            already_processed.add('language')
+            self.language = value
+        value = find_attr_value_('area', node)
+        if value is not None and 'area' not in already_processed:
+            already_processed.add('area')
+            self.area = value
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrposint', node)
+        if value is not None and 'attrposint' not in already_processed:
+            already_processed.add('attrposint')
+            try:
+                self.attrposint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrposint <= 0:
+                raise_parse_error(node, 'Invalid PositiveInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
+        value = find_attr_value_('attrnonposint', node)
+        if value is not None and 'attrnonposint' not in already_processed:
+            already_processed.add('attrnonposint')
+            try:
+                self.attrnonposint = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonposint > 0:
+                raise_parse_error(node, 'Invalid NonPositiveInteger')
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+        super(tomato_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'email':
+            email_ = child_.text
+            email_ = self.gds_validate_string(email_, node, 'email')
+            self.email = email_
+        elif nodeName_ == 'elposint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ <= 0:
+                raise_parse_error(child_, 'requires positiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elposint')
+            self.elposint = ival_
+        elif nodeName_ == 'elnonposint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ > 0:
+                raise_parse_error(child_, 'requires nonPositiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonposint')
+            self.elnonposint = ival_
+        elif nodeName_ == 'elnegint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ >= 0:
+                raise_parse_error(child_, 'requires negativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnegint')
+            self.elnegint = ival_
+        elif nodeName_ == 'elnonnegint':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ < 0:
+                raise_parse_error(child_, 'requires nonNegativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonnegint')
+            self.elnonnegint = ival_
+        elif nodeName_ == 'eldate':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.eldate = dval_
+        elif nodeName_ == 'eldatetime':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.eldatetime = dval_
+        elif nodeName_ == 'eltoken':
+            eltoken_ = child_.text
+            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
+            self.eltoken = eltoken_
+        elif nodeName_ == 'elshort':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'elshort')
+            self.elshort = ival_
+        elif nodeName_ == 'ellong':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'ellong')
+            self.ellong = ival_
+        elif nodeName_ == 'elparam':
+            obj_ = tomato_param.factory()
+            obj_.build(child_)
+            self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
+        elif nodeName_ == 'elarraytypes':
+            elarraytypes_ = child_.text
+            elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
+            self.elarraytypes = elarraytypes_
+            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
+        super(tomato_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_programmer
+
+
+class tomato_param(GeneratedsSuper):
+    """Finding flow attribute unneccesary in practice. A unnamed parameter
+    is unbound/skipped."""
+    member_data_items_ = [
+        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('name', 'xs:NCName', 0),
+        MemberSpec_('flow', 'FlowType', 0),
+        MemberSpec_('sid', 'xs:NCName', 0),
+        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0),
+        MemberSpec_('valueOf_', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.semantic = _cast(None, semantic)
+        self.name = _cast(None, name)
+        self.flow = _cast(None, flow)
+        self.sid = _cast(None, sid)
+        self.type_ = _cast(None, type_)
+        self.id = _cast(None, id)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if tomato_param.subclass:
+            return tomato_param.subclass(*args_, **kwargs_)
+        else:
+            return tomato_param(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_sid(self): return self.sid
+    def set_sid(self, sid): self.sid = sid
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (quote_attrib(self.name), ))
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
+        pass
+    def exportLiteral(self, outfile, level, name_='param'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+        showIndent(outfile, level)
+        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            showIndent(outfile, level)
+            outfile.write('semantic="%s",\n' % (self.semantic,))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            showIndent(outfile, level)
+            outfile.write('name="%s",\n' % (self.name,))
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            showIndent(outfile, level)
+            outfile.write('flow=%s,\n' % (self.flow,))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            showIndent(outfile, level)
+            outfile.write('sid="%s",\n' % (self.sid,))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            showIndent(outfile, level)
+            outfile.write('type_="%s",\n' % (self.type_,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            showIndent(outfile, level)
+            outfile.write('id="%s",\n' % (self.id,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('flow', node)
+        if value is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            self.flow = value
+        value = find_attr_value_('sid', node)
+        if value is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            self.sid = value
+        value = find_attr_value_('type', node)
+        if value is not None and 'type' not in already_processed:
+            already_processed.add('type')
+            self.type_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class tomato_param
+
+
+class tomato_python_programmer(tomato_programmer):
+    member_data_items_ = [
+        MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('favorite_editor', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = tomato_programmer
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+        self.nick_name = _cast(None, nick_name)
+        self.favorite_editor = favorite_editor
+    def factory(*args_, **kwargs_):
+        if tomato_python_programmer.subclass:
+            return tomato_python_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_python_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_favorite_editor(self): return self.favorite_editor
+    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
+    def get_nick_name(self): return self.nick_name
+    def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def hasContent_(self):
+        if (
+            self.favorite_editor is not None or
+            super(tomato_python_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'):
+        super(tomato_python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='python-programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        super(tomato_python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_python_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.favorite_editor is not None:
+            showIndent(outfile, level)
+            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('nick-name', node)
+        if value is not None and 'nick-name' not in already_processed:
+            already_processed.add('nick-name')
+            self.nick_name = value
+        super(tomato_python_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'favorite-editor':
+            favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
+            self.favorite_editor = favorite_editor_
+        super(tomato_python_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_python_programmer
+
+
+class tomato_java_programmer(tomato_programmer):
+    member_data_items_ = [
+        MemberSpec_('status', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('favorite_editor', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = tomato_programmer
+    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+        self.status = _cast(None, status)
+        self.nick_name = _cast(None, nick_name)
+        self.favorite_editor = favorite_editor
+    def factory(*args_, **kwargs_):
+        if tomato_java_programmer.subclass:
+            return tomato_java_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_java_programmer(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_favorite_editor(self): return self.favorite_editor
+    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
+    def get_nick_name(self): return self.nick_name
+    def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def hasContent_(self):
+        if (
+            self.favorite_editor is not None or
+            super(tomato_java_programmer, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
+        super(tomato_java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
+        super(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='java-programmer'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            showIndent(outfile, level)
+            outfile.write('status="%s",\n' % (self.status,))
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        super(tomato_java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(tomato_java_programmer, self).exportLiteralChildren(outfile, level, name_)
+        if self.favorite_editor is not None:
+            showIndent(outfile, level)
+            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
+        value = find_attr_value_('nick-name', node)
+        if value is not None and 'nick-name' not in already_processed:
+            already_processed.add('nick-name')
+            self.nick_name = value
+        super(tomato_java_programmer, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'favorite-editor':
+            favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
+            self.favorite_editor = favorite_editor_
+        super(tomato_java_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_java_programmer
+
+
+class tomato_agent(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('priority', 'xs:float', 0),
+        MemberSpec_('info', 'info', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.priority = priority
+        self.info = info
+    def factory(*args_, **kwargs_):
+        if tomato_agent.subclass:
+            return tomato_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_agent(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    def get_info(self): return self.info
+    def set_info(self, info): self.info = info
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.priority is not None or
+            self.info is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='agent'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='agent', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='agent'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.priority is not None:
+            showIndent(outfile, level)
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.info is not None:
+            showIndent(outfile, level)
+            outfile.write('info=model_.info(\n')
+            self.info.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'info':
+            obj_ = tomato_info.factory()
+            obj_.build(child_)
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+# end class tomato_agent
+
+
+class tomato_special_agent(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('priority', 'xs:float', 0),
+        MemberSpec_('info', 'info', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.priority = priority
+        self.info = info
+    def factory(*args_, **kwargs_):
+        if tomato_special_agent.subclass:
+            return tomato_special_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_special_agent(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    def get_info(self): return self.info
+    def set_info(self, info): self.info = info
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.priority is not None or
+            self.info is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agent'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='special-agent', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='special-agent'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.priority is not None:
+            showIndent(outfile, level)
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.info is not None:
+            showIndent(outfile, level)
+            outfile.write('info=model_.info(\n')
+            self.info.exportLiteral(outfile, level)
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'info':
+            obj_ = tomato_info.factory()
+            obj_.build(child_)
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+# end class tomato_special_agent
+
+
+class tomato_booster(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('firstname', 'xs:string', 0),
+        MemberSpec_('lastname', 'xs:string', 0),
+        MemberSpec_('other_name', 'xs:float', 0),
+        MemberSpec_('class_', 'xs:float', 0),
+        MemberSpec_('other_value', 'xs:float', 1),
+        MemberSpec_('type_', 'xs:float', 1),
+        MemberSpec_('client_handler', 'client-handlerType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
+        self.firstname = firstname
+        self.lastname = lastname
+        self.other_name = other_name
+        self.class_ = class_
+        if other_value is None:
+            self.other_value = []
+        else:
+            self.other_value = other_value
+        if type_ is None:
+            self.type_ = []
+        else:
+            self.type_ = type_
+        if client_handler is None:
+            self.client_handler = []
+        else:
+            self.client_handler = client_handler
+    def factory(*args_, **kwargs_):
+        if tomato_booster.subclass:
+            return tomato_booster.subclass(*args_, **kwargs_)
+        else:
+            return tomato_booster(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    def get_other_name(self): return self.other_name
+    def set_other_name(self, other_name): self.other_name = other_name
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_other_value(self): return self.other_value
+    def set_other_value(self, other_value): self.other_value = other_value
+    def add_other_value(self, value): self.other_value.append(value)
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def add_type(self, value): self.type_.append(value)
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
+    def get_client_handler(self): return self.client_handler
+    def set_client_handler(self, client_handler): self.client_handler = client_handler
+    def add_client_handler(self, value): self.client_handler.append(value)
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.other_name is not None or
+            self.class_ is not None or
+            self.other_value or
+            self.type_ or
+            self.client_handler
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+        if self.other_name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
+        if self.class_ is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sclass>%s</%sclass>%s' % (namespace_, self.gds_format_float(self.class_, input_name='class'), namespace_, eol_))
+        for other_value_ in self.other_value:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sother-value>%s</%sother-value>%s' % (namespace_, self.gds_format_float(other_value_, input_name='other-value'), namespace_, eol_))
+        for type_ in self.type_:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_))
+        for client_handler_ in self.client_handler:
+            client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='booster'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+        if self.other_name is not None:
+            showIndent(outfile, level)
+            outfile.write('other_name=%f,\n' % self.other_name)
+        if self.class_ is not None:
+            showIndent(outfile, level)
+            outfile.write('class_=%f,\n' % self.class_)
+        showIndent(outfile, level)
+        outfile.write('other_value=[\n')
+        level += 1
+        for other_value_ in self.other_value:
+            showIndent(outfile, level)
+            outfile.write('%f,\n' % other_value_)
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('type_=[\n')
+        level += 1
+        for type_ in self.type_:
+            showIndent(outfile, level)
+            outfile.write('%f,\n' % type_)
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('client_handler=[\n')
+        level += 1
+        for client_handler_ in self.client_handler:
+            showIndent(outfile, level)
+            outfile.write('model_.client_handlerType(\n')
+            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'other-name':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_name')
+            self.other_name = fval_
+        elif nodeName_ == 'class':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'class')
+            self.class_ = fval_
+        elif nodeName_ == 'other-value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_value')
+            self.other_value.append(fval_)
+        elif nodeName_ == 'type':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'type')
+            self.type_.append(fval_)
+        elif nodeName_ == 'client-handler':
+            obj_ = tomato_client_handlerType.factory()
+            obj_.build(child_)
+            self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
+# end class tomato_booster
+
+
+class tomato_info(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('name', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
+        self.rating = _cast(float, rating)
+        self.type_ = _cast(int, type_)
+        self.name = _cast(None, name)
+    def factory(*args_, **kwargs_):
+        if tomato_info.subclass:
+            return tomato_info.subclass(*args_, **kwargs_)
+        else:
+            return tomato_info(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
+        pass
+    def exportLiteral(self, outfile, level, name_='info'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            showIndent(outfile, level)
+            outfile.write('rating=%f,\n' % (self.rating,))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            showIndent(outfile, level)
+            outfile.write('type_=%d,\n' % (self.type_,))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            showIndent(outfile, level)
+            outfile.write('name="%s",\n' % (self.name,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError, exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('type', node)
+        if value is not None and 'type' not in already_processed:
+            already_processed.add('type')
+            try:
+                self.type_ = int(value)
+            except ValueError, exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class tomato_info
+
+
+class tomato_client_handlerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('fullname', 'xs:string', 0),
+        MemberSpec_('refid', 'xs:integer', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
+        self.fullname = fullname
+        self.refid = refid
+    def factory(*args_, **kwargs_):
+        if tomato_client_handlerType.subclass:
+            return tomato_client_handlerType.subclass(*args_, **kwargs_)
+        else:
+            return tomato_client_handlerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_fullname(self): return self.fullname
+    def set_fullname(self, fullname): self.fullname = fullname
+    def get_refid(self): return self.refid
+    def set_refid(self, refid): self.refid = refid
+    def hasContent_(self):
+        if (
+            self.fullname is not None or
+            self.refid is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='client-handlerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='client-handlerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.fullname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
+        if self.refid is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='client-handlerType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.fullname is not None:
+            showIndent(outfile, level)
+            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
+        if self.refid is not None:
+            showIndent(outfile, level)
+            outfile.write('refid=%d,\n' % self.refid)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'fullname':
+            fullname_ = child_.text
+            fullname_ = self.gds_validate_string(fullname_, node, 'fullname')
+            self.fullname = fullname_
+        elif nodeName_ == 'refid':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'refid')
+            self.refid = ival_
+# end class tomato_client_handlerType
+
+
+GDSClassesMapping = {
+    'client-handler': tomato_client_handlerType,
+    'elparam': tomato_param,
+    'promoter': tomato_booster,
+}
+
+
+USAGE_TEXT = """
+Usage: python <tomato_Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "tomato_agent",
+    "tomato_booster",
+    "tomato_client_handlerType",
+    "tomato_comments",
+    "tomato_info",
+    "tomato_java_programmer",
+    "tomato_param",
+    "tomato_people",
+    "tomato_person",
+    "tomato_programmer",
+    "tomato_python_programmer",
+    "tomato_special_agent"
+]
diff --git a/tests/test.py b/tests/test.py
index 96a05e2..5e965bc 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -525,6 +525,31 @@ class GenTest(unittest.TestCase):
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
 
+    def test_024_prefix_classname(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '-p tomato_ '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'prefix_classname'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        result, _ = self.execute(cmd, cwd='..')
+        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ('sys.stdout.write',))
+        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ())
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        result, _ = self.execute(cmd, cwd='..')
+        cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ())
+
     def check_result(self, result, err, ignore_strings):
         self.failUnlessEqual(len(result), 0)
         self.failUnlessEqual(len(err), 0)
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index ce70917..4229ff0 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13: http://docutils.sourceforge.net/" />
 <title>generateDS -- Introduction and Tutorial</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -219,7 +219,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12e</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
 </tr>
 </tbody>
 </table>
@@ -228,7 +228,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 22, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_tutorial.txt">View document source</a>.
-Generated on: 2014-05-22 16:15 UTC.
+Generated on: 2014-09-09 19:14 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index 0dcab2b..3a9d416 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.12g
+:revision: 2.13a
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 0a67f630b3d3efdefc4e51b17fc154474101f81b..157eecae050a3a0201ce0ca0984aaeb93fe97c59 100644
GIT binary patch
delta 12131
zcmZX41yEeuwr%6??v1-^aCdii4-h<f)3{3-4GzI2XmEFe1b27$pb0<cocrIs_r2P+
zS5=QW$F#kwYjyAO@CyC(3QeM}1Otl;000mHP8N(Zx{||)TF?Lh3>*MJ0O^J%0D1a&
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

delta 12084
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
U0^v0s0D%5_zY+s<+x|ZNAL-~s{Qv*}

diff --git a/updateversion.py b/updateversion.py
new file mode 100755
index 0000000..b122794
--- /dev/null
+++ b/updateversion.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+"""
+Usage:
+    python updateversion.py [options]
+Options:
+    -h, --help          Display this help message.
+    -v x.xx, --version=x.xx
+                        New version.  Required.
+    --verbose           Print extra info.
+Example:
+    python updateversion.py -v 1.17c
+"""
+
+
+#
+# Imports
+
+import sys
+import getopt
+import re
+import shutil
+
+
+#
+# Globals and constants
+
+VERBOSE = False
+
+REPL_SPEC = [
+    {
+        'filename': 'setup.py',
+        'pattern': r'(##VERSION##\s*version=")([\w\.\-]*)(",\s*##VERSION##)',
+    },
+    {
+        'filename': 'generateDS.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+    {
+        'filename': 'process_includes.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+    {
+        'filename': 'generateDS.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'generateDS.txt',
+        'pattern': r"(\.\. version\s*- My Web site -- \s*"
+                   r"http://www\.rexx\.com/~dkuhlman/generateDS-)"
+                   r"([\w\.\-]*)(\.tar\.gz\s*\.\. version)",
+    },
+    {
+        'filename': 'librarytemplate_howto.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'tutorial/generateds_tutorial.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'gui/generateds_gui.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+]
+
+
+#
+# Functions for external use
+
+def updateversion(version):
+    replfunc = replfuncmaker(version)
+    for spec in REPL_SPEC:
+        targetfilename = spec['filename']
+        if VERBOSE:
+            print 'updating: "%s"' % (targetfilename, )
+        targetfile = open(targetfilename, 'r')
+        content = targetfile.read()
+        targetfile.close()
+        content1 = re.sub(
+            spec['pattern'],
+            replfunc,
+            content)
+        update1file(targetfilename, content1)
+
+
+
+#
+# Classes
+
+
+
+#
+# Functions for internal use and testing
+
+def update1file(targetfilename, content):
+    backupfilename = targetfilename + '.bak' 
+    shutil.copy2(targetfilename, backupfilename)
+    targetfile = open(targetfilename, 'w')
+    targetfile.write(content)
+    targetfile.close()
+    #shutil.copymode(backupfilename, targetfilename)
+
+def replfuncmaker(version):
+    def replfunc(matchobj):
+        if VERBOSE:
+            print '(replfunc) matchobj.groups()', matchobj.groups()
+        return matchobj.group(1) + version + matchobj.group(3)
+    return replfunc
+
+
+USAGE_TEXT = __doc__
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    global VERBOSE
+    args = sys.argv[1:]
+    try:
+        opts, args = getopt.getopt(args, 'hv:', [
+            'help', 'version=', 'verbose', ])
+    except:
+        usage()
+    version = None
+    for opt, val in opts:
+        if opt in ('-h', '--help'):
+            usage()
+        elif opt in ('-v', '--version'):
+            version = val
+        elif opt in ('--verbose', ):
+            VERBOSE = True
+    if len(args) != 0 or version is None:
+        usage()
+    updateversion(version)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
-- 
GitLab