Index: trunk/examples/objects/api/c/library
===================================================================
--- trunk/examples/objects/api/c/library	(revision 1581)
+++ trunk/examples/objects/api/c/library	(revision 1581)
@@ -0,0 +1,138 @@
+Library
+
+    Rp_LibraryInit()
+    Rp_LibraryCopy(const Rp_Library* o)
+    Rp_LibraryDestroy(Rp_Library *lib)
+
+    Outcome *Rp_LibraryLoadXml(Rp_Library *lib, const char *xmltext)
+    Outcome *Rp_LibraryLoadFile(Rp_Library *lib, const char *filename)
+
+
+    void Rp_LibraryValue(Rp_Library *lib, const char *key,
+        void *storage, size_t numHints, ...)
+
+    Rp_Chain *Rp_LibraryDiff(Rp_Library *lib1, Rp_Library *lib2)
+
+    void Rp_LibraryRemove (Rp_Library *lib, const char *key)
+
+    const char *Rp_LibraryXml(Rp_Library *lib) const
+
+    Outcome *Rp_LibraryOutcome(Rp_Library *lib) const
+    int Rp_LibraryError(Rp_Library *lib) const
+
+    Outcome *Rp_LibraryResult(Rp_Library *lib, int status)
+
+    const Rp_Chain *Rp_LibraryContains(Rp_Library *lib) const
+
+---------------------------------------
+
+Outcome *Rp_LibraryLoadXml(Rp_Library *lib, const char *xmltext)
+    Purpose: parse the Rappture1.1 xml data in "xmltext".
+                populate this library object with the Rappture
+                objects described in the xml data.
+    Input Arguments: 2
+        1. Rp_Library *lib - pointer to Library object
+        1. const char *xmltext - Rappture1.1 xml data
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+Outcome *Rp_LibraryLoadFile(Rp_Library *lib, const char *filename);
+    Purpose: read the file "filename" and parse the
+                Rappture1.1 xml data found inside of it.
+                populate this library object with the Rappture
+                objects described in the xml data.
+    Input Arguments: 2
+        1. Rp_Library *lib - pointer to Library object
+        2. const char *filename - file containing Rappture1.1
+                                    xml data
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+void Rp_LibraryValue(Rp_Library *lib, const char *key, void *storage,
+                     size_t numHints, ...);
+    Purpose: retrieve the value of the object named "key" and
+                store it in "storage". If there are hints,
+                pass them along to the object being retrieved
+                to tell it how the value should be configured.
+    Input Arguments: at least 4
+        1. Rp_Library *lib - pointer to Library object
+        2. const char *key - name of the object being retrieved
+        3. void *storage - where to place the value of the
+                            retrieved object
+        4. size_t numHints - number of hints provided
+        5. ... - hints listed as strings
+    Return Value: None
+    Notes: hints are listed as strings of the form
+            "hintKey=hintVal". hintKey is the key for the hint
+            and hintVal is the value to be applied to the hint.
+            generally, unrecognized hints are ignored. the hints
+            should be listed as comma separated strings in the
+            function's argument list.
+    Code Example:
+
+Rp_Chain *Rp_LibraryDiff(Rp_Library *lib1, Rp_Library *lib2);
+    Purpose: find the difference between two library objects
+    Input Arguments: 2
+        1. Rp_Library *lib1 - base object used in comparison
+        2. Rp_Library *lib2 - other object used in comparison
+    Return Value: Linked list of differences
+    Notes: None
+    Code Example:
+
+void Rp_LibraryRemove (Rp_Library *lib, const char *key);
+    Purpose: remove the object from this library named "key"
+    Input Arguments: 2
+        1. Rp_Library *lib - pointer to Library object
+        2. const char *key - name of the object to remove
+    Return Value: None
+    Notes: The object is removed and it's memory is deleted
+    Code Example:
+
+const char *Rp_LibraryXml(Rp_Library *lib) const;
+    Purpose: return the Rappture1.1 xml representation of the
+                objects stored in this library.
+    Input Arguments: 1
+        1. Rp_Library *lib - pointer to Library object
+    Return Value: None
+    Notes: user is responsible for free'ing returned memory?
+    Code Example:
+
+Outcome *Rp_LibraryOutcome(Rp_Library *lib) const;
+    Purpose: return the status of the object
+    Input Arguments: 1
+        1. Rp_Library *lib - pointer to Library object
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+int Rp_LibraryError(Rp_Library *lib) const;
+    Purpose: return the status of the object
+    Input Arguments: 1
+        1. Rp_Library *lib - pointer to Library object
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+Outcome *Rp_LibraryResult(Rp_Library *lib, int status);
+    Purpose: write the stored objects to a data file and
+                signal the end of processing.
+    Input Arguments: 2
+        1. Rp_Library *lib - pointer to Library object
+        2. int status - status of the simulation
+    Return Value: None
+    Notes: currently data file are written out as Rappture1.1
+            xml. this function generates the RAPPTURE-RUN=>
+            signal.
+    Code Example:
+
+const Rp_Chain *Rp_LibraryContains(Rp_Library *lib) const;
+    Purpose: return a linked list of the Rappture objects
+                stored in this library.
+    Input Arguments: 1
+        1. Rp_Library *lib - pointer to Library object
+    Return Value: linked list of the Rappture objects stored in
+                    this library.
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/api/c/number
===================================================================
--- trunk/examples/objects/api/c/number	(revision 1581)
+++ trunk/examples/objects/api/c/number	(revision 1581)
@@ -0,0 +1,520 @@
+Number
+
+    Rp_NumberInit(Rp_Number *num)
+    Rp_NumberInit2(Rp_Number *num, const char *name, const char *units,
+                   double val);
+    Rp_NumberInit3(Rp_Number *num, const char *name, const char *units,
+                   double val, double min, double max, const char *label,
+                   const char *desc);
+    Rp_NumberCopy(const Rp_Number* o);
+    Rp_NumberDestroy(Rp_Number *num);
+
+    const char *Rp_NumberGetName(Rp_Number *num) const;
+    void Rp_NumberSetName(Rp_Number *num, const char *val);
+
+    const char *Rp_NumberGetPath(Rp_Number *num) const;
+    void Rp_NumberSetPath(Rp_Number *num, const char *val);
+
+    const char *Rp_NumberGetLabel(Rp_Number *num) const;
+    void Rp_NumberSetLabel(Rp_Number *num, const char *val);
+
+    const char *Rp_NumberGetDesc(Rp_Number *num) const;
+    void Rp_NumberSetDesc(Rp_Number *num, const char *val);
+
+    const char *Rp_NumberGetHints(Rp_Number *num) const;
+    void Rp_NumberSetHints(Rp_Number *num, const char *val);
+
+    const char *Rp_NumberGetColor(Rp_Number *num) const;
+    void Rp_NumberSetColor(Rp_Number *num, const char *val);
+
+    double Rp_NumberGetDefault(Rp_Number *num) const;
+    void Rp_NumberSetDefault(Rp_Number *num, double val);
+
+    double Rp_NumberGetCurrent(Rp_Number *num) const;
+    void Rp_NumberSetCurrent(Rp_Number *num, double val);
+
+    double Rp_NumberGetMin(Rp_Number *num) const;
+    void Rp_NumberSetMin(Rp_Number *num, double val);
+
+    double Rp_NumberGetMax(Rp_Number *num) const;
+    void Rp_NumberSetMax(Rp_Number *num, double val);
+
+    const char *Rp_NumberGetUnits(Rp_Number *num) const;
+    void Rp_NumberSetUnits(Rp_Number *num, const char *u);
+
+    int Rp_NumberDefaultSet(Rp_Number *num) const;
+    int Rp_NumberCurrentSet(Rp_Number *num) const;
+
+    const void *Rp_NumberGetProperty (Rp_Number *num, const char *key) const;
+    void Rp_NumberSetProperty (Rp_Number *num, const char *key,
+                               const void *val, size_t nbytes);
+
+    const char *Rp_NumberPropStr (Rp_Number *num, const char *key) const;
+    void Rp_NumberPropStr (Rp_Number *num, const char *key, const char *val);
+
+    void Rp_NumberPropRemove (Rp_Number *num, const char *key);
+
+    Outcome& Rp_NumberConvert(Rp_Number *num, const char *to);
+    double Rp_NumberValue(Rp_Number *num, const char *units) const;
+    void Rp_NumberVValue(Rp_Number *num, void *storage, size_t numHints,
+                         va_list arg) const;
+
+    void Rp_NumberAddPreset(Rp_Number *num, const char *label,
+                            const char *desc, double val,
+                            const char *units);
+
+    void Rp_NumberAddPreset2(Rp_Number *num, const char *label,
+                             const char *desc, const char *val);
+
+    void Rp_NumberDelPreset(Rp_Number *num, const char *label);
+
+    void Rp_NumberConfigure(Rp_Number *num, size_t as, ClientData c);
+    void Rp_NumberDump(Rp_Number *num, size_t as, ClientData c);
+
+    Outcome *Rp_NumberOutcome(Rp_Number *num) const;
+
+    const int Rp_NumberIs(Rp_Number *num) const;
+
+    void Rp_NumberMinFromStr(Rp_Number *num, const char *val);
+    void Rp_NumberMaxFromStr(Rp_Number *num, const char *val);
+    void Rp_NumberDefaultFromStr(Rp_Number *num, const char *val);
+    void Rp_NumberCurrentFromStr(Rp_Number *num, const char *val);
+
+---------------------------------------
+
+const char *Rp_NumberGetName(Rp_Number *num)
+    Purpose: get the id name of the object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void Rp_NumberSetName(Rp_Number *num, const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_NumberGetpath(Rp_Number *num)
+    Purpose: get the path of the object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void Rp_NumberSetPath(Rp_Number *num, const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_NumberGetLabel(Rp_Number *num)
+    Purpose: get the label of the object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void Rp_NumberSetLabel(Rp_Number *num, const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_NumberGetDesc(Rp_Number *num)
+    Purpose: get the description of the object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void Rp_NumberSetDesc(Rp_Number *num, const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_NumberGetHints(Rp_Number *num)
+    Purpose: get the hints of the object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void Rp_NumberSetHints(Rp_Number *num, const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+double Rp_NumberGetDefault(Rp_Number *num)
+    Purpose: get the default value
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the default value stored in the object.
+    Notes: use the function defset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void Rp_NumberSetDefault(Rp_Number *num, double val)
+    Purpose: set the default value
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. double val - new default value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double Rp_NumberGetCurrent(Rp_Number *num)
+    Purpose: get the current value
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the current value stored in the object.
+    Notes: use the function curset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void Rp_NumerSetCurrent(Rp_Number *num, double val)
+    Purpose: set the current value
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. double val - new current value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double Rp_NumberGetMin(Rp_Number *num)
+    Purpose: get the minimum accepted value of this object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the minimum value this object will accept.
+    Notes: use the function minset() to see if a valid
+            minimum value was stored in the object.
+    Code Example:
+
+void Rp_NumberSetMin(Rp_Number *num, double val)
+    Purpose: set the minimum accepted value of this object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. double val - new minimum accepted value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double Rp_NumberGetMax(Rp_Number *num)
+    Purpose: get the maximum accepted value of this object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the maximum value this object will accept.
+    Notes: use the function maxset() to see if a valid
+            maximum value was stored in the object.
+    Code Example:
+
+void Rp_NumberSetMax(Rp_Number *num, double val)
+    Purpose: set the maximum accepted value of this object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. double val - new maximum accepted value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+const char* Rp_NumberGetUnits(Rp_Number *num)
+    Purpose: get the units of this object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: the string representing the object's units
+    Notes: None
+    Code Example:
+
+void Rp_NumberSetUnits(Rp_Number *num, const char *val)
+    Purpose: set the units of this object
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - new units
+    Return Value: None
+    Notes: None
+    Code Example:
+
+int Rp_NumberDefaultSet(Rp_Number *num) const
+    Purpose: return whether the default value was set by the user
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: 1 if default was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+int Rp_NumberCurrentSet(Rp_Number *Num) const
+    Purpose: return whether the current value was set by the user
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: 1 if current was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+const void *Rp_NumberGetProperty (Rp_Number *num, const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void Rp_NumberSetProperty (Rp_Number *num, const char *key,
+                           const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 4
+        1. Rp_Number *num - pointer to Number object
+        2. const char *key - property name
+        3. const void *val - property value
+        4. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *Rp_NumberGetPropStr (Rp_Number *num, const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void Rp_NumberSetPropStr (Rp_Number *num, const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 3
+        1. Rp_Number *num - pointer to Number object
+        2. const char *key - property name
+        3. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void Rp_NumberPropRemove (Rp_Number *num, const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+Outcome *Rp_NumberConvert(Rp_Number *num, const char *to);
+    Purpose: convert the def and cur values to "to" units
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *to - string of units to convert to
+    Return Value: Outcome object
+    Notes: the values stored in the object are changed
+    Code Example:
+
+double Rp_NumberValue(Rp_Number *num, const char *to) const;
+    Purpose: return the value of the object with units of "to"
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *to - string of units to convert to
+    Return Value: value of the object
+    Notes: cur() is used as the base value. if cur was not set
+            by the user (curset() == 0), def() is used.
+            if def was not set (defset() == 0), 0.0 is used
+            as the value.
+    Code Example:
+
+void Rp_NumberVValue(Rp_Number *num, void *storage, size_t numHints,
+                     va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 4
+        1. Rp_Number *num - pointer to Number object
+        2. void *storage - the return value
+        3. size_t numHints - number of hints provided
+        4. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+void Rp_NumberAddPreset(Rp_Number *num, const char *label, const char *desc,
+                        double val, const char *units);
+    Purpose: add a preset to this object
+    Input Arguments: 5
+        1. Rp_Number *num - pointer to Number object
+        2. const char *label - label of the preset
+        3. const char *desc - description of the preset
+        4. double val - value of the preset
+        5. const char *units - units of the preset
+    Return Value: None
+    Notes: presets are stored in the object in the same order
+                in which they are created
+    Code Example:
+
+void Rp_NumberAddPreset2(Rp_Number *num, const char *label, const char *desc,
+                         const char *val);
+    Purpose: add a preset to this object
+    Input Arguments: 4
+        1. Rp_Number *num - pointer to Number object
+        2. const char *label - label of the preset
+        3. const char *desc - description of the preset
+        4. const char *val - numeric value and units of the preset
+    Return Value: None
+    Notes: presets are stored in the object in the same order
+                in which they are created
+    Code Example:
+
+void Rp_NumberDelPreset(Rp_Number *num, const char *label);
+    Purpose: delete the preset labeled "label" from this object
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+        2. const char *label - label of the preset
+    Return Value: None
+    Notes: preset is removed from the object
+    Code Example:
+
+void Rp_NumberConfigure(Rp_Number *num, size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 3
+        1. Rp_Number *num - pointer to Number object
+        2. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        3. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void Rp_NumberDump(Rp_Number *num, size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 3
+        1. Rp_Number *num - pointer to Number object
+        2. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        3. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+void Rp_NumberOutcome(Rp_Number *num) const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int Rp_NumberIs(Rp_Number *num) const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+    Return Value: integer tag unique to all number objects
+    Notes: None
+    Code Example:
+
+void Rp_NumberMinFromStr(Rp_Number *num, const char *val);
+    Purpose: populate the min() value from a string.
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - value and units for the
+                                minimum value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in min().
+    Code Example:
+
+void Rp_NumberMaxFromStr(Rp_Number *num, const char *val);
+    Purpose: populate the max() value from a string.
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - value and units for the
+                                maximum value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in max().
+    Code Example:
+
+void Rp_NumberDefaultFromStr(Rp_Number *num, const char *val);
+    Purpose: populate the def() value from a string.
+    Input Arguments: 2
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - value and units for the
+                                default value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in def().
+    Code Example:
+
+void Rp_NumberCurrentFromStr(Rp_Number *num, const char *val);
+    Purpose: populate the cur() value from a string.
+    Input Arguments: 1
+        1. Rp_Number *num - pointer to Number object
+        2. const char *val - value and units for the
+                                current value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in cur().
+    Code Example:
Index: trunk/examples/objects/api/c/plot
===================================================================
--- trunk/examples/objects/api/c/plot	(revision 1581)
+++ trunk/examples/objects/api/c/plot	(revision 1581)
@@ -0,0 +1,314 @@
+Plot
+
+    Rp_Plot *Rp_PlotInit(Rp_Library *lib)
+    void Rp_PlotDestroy (Rp_Plot *p);
+
+    const char *Rp_PlotGetName(Rp_Plot *p) const;
+    void Rp_PlotSetName(Rp_Plot *p, const char *val);
+
+    const char *Rp_PlotGetPath(Rp_Plot *p) const;
+    void Rp_PlotSetPath(Rp_Plot *p, const char *val);
+
+    const char *Rp_PlotGetLabel(Rp_Plot *p) const;
+    void Rp_PlotSetLabel(Rp_Plot *p, const char *val);
+
+    const char *Rp_PlotGetDesc(Rp_Plot *p) const;
+    void Rp_PlotSetDesc(Rp_Plot *p, const char *val);
+
+    const char *Rp_PlotGetHints(Rp_Plot *p) const;
+    void Rp_PlotSetHints(Rp_Plot *p, const char *val);
+
+    const char *Rp_PlotGetColor(Rp_Plot *p) const;
+    void Rp_PlotSetColor(Rp_Plot *p, const char *val);
+
+    const void *Rp_PlotGetProperty (Rp_Plot *p, const char *key) const;
+    void Rp_PlotSetProperty (Rp_Plot *p, const char *key, const void *val, size_t nbytes);
+
+    const char *Rp_PlotGetPropStr (Rp_Plot *p, const char *key) const;
+    void Rp_PlotSetPropStr (Rp_Plot *p, const char *key, const char *val);
+
+    void Rp_PlotPropRemove (Rp_Plot *p, const char *key);
+
+    void Rp_PlotAdd (Rp_Plot *p, size_t nPts, double *x, double *y,
+                      const char *fmt, const char *name);
+
+    void Rp_PlotAddCurve (Rp_Plot *p, Curve *c, const char *name);
+
+    size_t Rp_PlotCount(Rp_Plot *p) const;
+
+    Curve *Rp_PlotCurve (Rp_Plot *p, const char* name) const;
+    Curve *Rp_PlotGetNthCurve(Rp_Plot *p, size_t n) const;
+
+    void Rp_PlotVValue(Rp_Plot *p, void *storage, size_t numHints,
+                       va_list arg) const;
+
+    void Rp_PlotConfigure(Rp_Plot *p, size_t as, ClientData c);
+    void Rp_PlotDump(Rp_Plot *p, size_t as, ClientData c);
+
+    Outcome *Rp_PlotOutcome(Rp_Plot *p) const;
+
+    const int Rp_PlotIs(Rp_Plot *p) const;
+
+---------------------------------------
+
+const char *Rp_PlotGetName(Rp_Plot *p)
+    Purpose: get the id name of the object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void Rp_PlotSetName(Rp_Plot *p, const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_PlotGetPath(Rp_Plot *p)
+    Purpose: get the path of the object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void Rp_PlotGetPath(Rp_Plot *p, const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_PlotGetLabel(Rp_Plot *p)
+    Purpose: get the label of the object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void Rp_PlotSetLabel(Rp_Plot *p, const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_PlotGetDesc(Rp_Plot *p)
+    Purpose: get the description of the object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void Rp_PlotSetDesc(Rp_Plot *p, const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *Rp_PlotGetHints(Rp_Plot *p)
+    Purpose: get the hints of the object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void Rp_PlotSetHints(Rp_Plot *p, const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const void *Rp_PlotGetProperty (Rp_Plot *p, const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void Rp_PlotSetProperty (Rp_Plot *p, const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 4
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *key - property name
+        3. const void *val - property value
+        4. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *Rp_PlotGetPropStr (Rp_Plot *p, const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void Rp_PlotSetPropStr (Rp_Plot *p, const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 3
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *key - property name
+        3. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void Rp_PlotPropRemove (Rp_Plot *p, const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void Rp_PlotAdd (Rp_Plot *p, size_t nPts, double *x, double *y,
+                 const char *fmt, const char *name);
+    Purpose: add data for an xy curve to the plot
+    Input Arguments: 6
+        1. Rp_Plot *p - pointer to Plot object
+        2. size_t nPts - number of points in the x and y arrays
+        3. double *x - pointer to array representing the x axis
+        4. double *y - pointer to array representing the y axis
+        5. const char *fmt - format of the line
+        6. const char *name - id of the newly created curve
+    Return Value: reference to a Plot object
+    Notes: format can be something like "g:o" to represent
+            green line, dotted line style, circle marker.
+            this follows matlab's formatting rules.
+    Code Example:
+
+void Rp_PlotAddCurve (Rp_Plot *p, Curve *c, const char *name);
+    Purpose: add a Curve object to this Plot object
+    Input Arguments: 3
+        1. Rp_Plot *p - pointer to Plot object
+        2. Curve *c - Curve object to add
+        3. const char *name - id of the Curve object
+    Return Value: reference to a Plot object
+    Notes: Curve object should not be deleted by user?
+    Code Example:
+
+size_t Rp_PlotCount(Rp_Plot *p) const;
+    Purpose: retrieve the number of curves in this Plot object
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: number of curves stored in the object
+    Notes: None
+    Code Example:
+
+Curve *Rp_PlotCurve (Rp_Plot *p, const char* name) const;
+    Purpose: retrieve the curve with the id matching "name"
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. const char *name - id to Curve to be retrieved
+    Return Value: pointer to Curve object matching "name" or NULL
+    Notes: None
+    Code Example:
+
+Curve *Rp_PlotGetNthCurve(Rp_Plot *p, size_t n) const;
+    Purpose: return the n'th curve stored in the object
+    Input Arguments: 2
+        1. Rp_Plot *p - pointer to Plot object
+        2. size_t n - number of the curve to retrieve
+    Return Value: pointer to the n'th Curve object stored in
+                    the Plot object or NULL
+    Notes: None
+    Code Example:
+
+void Rp_PlotVValue(Rp_Plot *p, void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 4
+        1. Rp_Plot *p - pointer to Plot object
+        2. void *storage - the return value
+        3. size_t numHints - number of hints provided
+        4. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+void Rp_PlotConfigure(Rp_Plot *p, size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 3
+        1. Rp_Plot *p - pointer to Plot object
+        2. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        3. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void Rp_PlotDump(Rp_Plot *p, size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 3
+        1. Rp_Plot *p - pointer to Plot object
+        2. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        3. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome *Rp_PlotOutcome(Rp_Plot *p) const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int Rp_PlotIs(Rp_Plot *p) const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 1
+        1. Rp_Plot *p - pointer to Plot object
+    Return Value: integer tag unique to all plot objects
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/api/cpp/boolean
===================================================================
--- trunk/examples/objects/api/cpp/boolean	(revision 1581)
+++ trunk/examples/objects/api/cpp/boolean	(revision 1581)
@@ -0,0 +1,320 @@
+Boolean
+
+constructors/destructors
+    Boolean()
+    Boolean(const char *name, bool val);
+    Boolean(const char *name, bool val, const char *label,
+                const char *desc);
+    Boolean(const Boolean& o);
+    ~Boolean ();
+
+methods
+    const char *name() const;
+    void name(const char *val);
+
+    const char *path() const;
+    void path(const char *val);
+
+    const char *label() const;
+    void label(const char *val);
+
+    const char *desc() const;
+    void desc(const char *val);
+
+    const char *hints() const;
+    void hints(const char *val);
+
+    const char *color() const;
+    void color(const char *val);
+
+    bool def() const;
+    void def(bool val);
+
+    bool cur() const;
+    void cur(bool val);
+
+    int defset() const;
+    int curset() const;
+
+    const void *property (const char *key) const;
+    void property (const char *key, const void *val, size_t nbytes);
+
+    const char *propstr (const char *key) const;
+    void propstr (const char *key, const char *val);
+
+    void propremove (const char *key);
+
+    void vvalue(void *storage, size_t numHints, va_list arg) const;
+
+    void configure(size_t as, ClientData c);
+    void dump(size_t as, ClientData c);
+
+    Outcome &outcome() const;
+
+    const int is() const;
+
+    void defFromStr(const char *val);
+    void curFromStr(const char *val);
+
+---------------------------------------
+
+const char *name()
+    Purpose: get the id name of the object
+    Input Arguments: None
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void name(const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 1
+        1. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *path()
+    Purpose: get the path of the object
+    Input Arguments: None
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void path(const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 1
+        1. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *label()
+    Purpose: get the label of the object
+    Input Arguments: None
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void label(const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 1
+        1. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *desc()
+    Purpose: get the description of the object
+    Input Arguments: None
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void desc(const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 1
+        1. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *hints()
+    Purpose: get the hints of the object
+    Input Arguments: None
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void hints(const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 1
+        1. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+bool def()
+    Purpose: get the default value
+    Input Arguments: None
+    Return Value: the default value stored in the object.
+    Notes: None
+    Code Example:
+
+void def(bool val)
+    Purpose: set the default value
+    Input Arguments: 1
+        1. bool val - new default value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+bool cur()
+    Purpose: get the current value
+    Input Arguments: None
+    Return Value: the current value stored in the object.
+    Notes: None
+    Code Example:
+
+void cur(bool val)
+    Purpose: set the current value
+    Input Arguments: 1
+        1. bool val - new current value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+int defset() const
+    Purpose: return whether the default value was set by the user
+    Input Arguments: None
+    Return Value: 1 if default was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+int curset() const
+    Purpose: return whether the current value was set by the user
+    Input Arguments: None
+    Return Value: 1 if current was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+const void *property (const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void property (const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 3
+        1. const char *key - property name
+        2. const void *val - property value
+        3. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *propstr (const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void propstr (const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 2
+        1. const char *key - property name
+        2. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void propremove (const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void vvalue(void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 3
+        1. void *storage - the return value
+        2. size_t numHints - number of hints provided
+        3. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+void configure(size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void dump(size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 0
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int is() const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 0
+    Return Value: integer tag unique to all number objects
+    Notes: None
+    Code Example:
+
+void defFromStr(const char *val);
+    Purpose: populate the def() value from a string.
+    Input Arguments: 1
+        1. const char *val - the new default value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            that can be evaluated as a boolean. It evaluates
+            case insensitive versions of the strings "true", "1"
+            "yes", and "on" as positives boolean expressions.
+            Case insensitive version of the strings "false",
+            "0", "no", and "off" are evaluated as negative
+            boolean expressions.
+    Code Example:
+
+void curFromStr(const char *val);
+    Purpose: populate the cur() value from a string.
+    Input Arguments: 1
+        1. const char *val - the new current value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            that can be evaluated as a boolean. It evaluates
+            case insensitive versions of the strings "true", "1"
+            "yes", and "on" as positives boolean expressions.
+            Case insensitive version of the strings "false",
+            "0", "no", and "off" are evaluated as negative
+            boolean expressions.
+    Code Example:
Index: trunk/examples/objects/api/cpp/choice
===================================================================
--- trunk/examples/objects/api/cpp/choice	(revision 1581)
+++ trunk/examples/objects/api/cpp/choice	(revision 1581)
@@ -0,0 +1,319 @@
+Choice
+
+constructors/destructors
+    Choice()
+    Choice(const char *name, const char *val);
+    Choice(const char *name, const char *val,
+           const char *label, const char *desc);
+    Choice(const Number& o);
+    ~Choice ();
+
+methods
+    const char *name() const;
+    void name(const char *val);
+
+    const char *path() const;
+    void path(const char *val);
+
+    const char *label() const;
+    void label(const char *val);
+
+    const char *desc() const;
+    void desc(const char *val);
+
+    const char *hints() const;
+    void hints(const char *val);
+
+    const char *color() const;
+    void color(const char *val);
+
+    const char *def() const;
+    void def(const char *val);
+
+    const char *cur() const;
+    void cur(const char *val);
+
+    int defset() const;
+    int curset() const;
+
+    const void *property (const char *key) const;
+    void property (const char *key, const void *val, size_t nbytes);
+
+    const char *propstr (const char *key) const;
+    void propstr (const char *key, const char *val);
+
+    void propremove (const char *key);
+
+    void vvalue(void *storage, size_t numHints, va_list arg) const;
+
+    Choice& addPreset(const char *label, const char *desc,
+                      const char *val);
+
+    Choice& delPreset(const char *label);
+
+    void configure(size_t as, ClientData c);
+    void dump(size_t as, ClientData c);
+
+    Outcome &outcome() const;
+
+    const int is() const;
+
+
+---------------------------------------
+
+const char *name()
+    Purpose: get the id name of the object
+    Input Arguments: None
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void name(const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 1
+        1. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *path()
+    Purpose: get the path of the object
+    Input Arguments: None
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void path(const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 1
+        1. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *label()
+    Purpose: get the label of the object
+    Input Arguments: None
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void label(const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 1
+        1. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *desc()
+    Purpose: get the description of the object
+    Input Arguments: None
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void desc(const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 1
+        1. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *hints()
+    Purpose: get the hints of the object
+    Input Arguments: None
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void hints(const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 1
+        1. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *def() const;
+    Purpose: get the default value
+    Input Arguments: None
+    Return Value: label of the default value stored in the
+                    object.
+    Notes: use the function defset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void def(const char *val);
+    Purpose: set the default value
+    Input Arguments: 1
+        1. const char *val - label of the new default value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+const char *cur() const;
+    Purpose: get the current value
+    Input Arguments: None
+    Return Value: label of the current value stored in the
+                    object.
+    Notes: use the function curset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void cur(const char *val);
+    Purpose: set the current value
+    Input Arguments: 1
+        1. const char *val - label of the new current value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+int defset() const
+    Purpose: return whether the default value was set by the user
+    Input Arguments: None
+    Return Value: 1 if default was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+int curset() const
+    Purpose: return whether the current value was set by the user
+    Input Arguments: None
+    Return Value: 1 if current was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+const void *property (const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void property (const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 3
+        1. const char *key - property name
+        2. const void *val - property value
+        3. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *propstr (const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void propstr (const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 2
+        1. const char *key - property name
+        2. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void propremove (const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void vvalue(void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 3
+        1. void *storage - the return value
+        2. size_t numHints - number of hints provided
+        3. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+Choice& addPreset(const char *label, const char *desc,
+                  const char *val);
+    Purpose: add a preset to this object
+    Input Arguments: 3
+        1. const char *label - label of the preset
+        2. const char *desc - description of the preset
+        3. const char *val - numeric value and units of the preset
+    Return Value: None
+    Notes: presets are stored in the object in the same order
+                in which they are created
+    Code Example:
+
+Choice& delPreset(const char *label);
+    Purpose: delete the preset labeled "label" from this object
+    Input Arguments: 1
+        1. const char *label - label of the preset
+    Return Value: None
+    Notes: preset is removed from the object
+    Code Example:
+
+void configure(size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void dump(size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 0
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int is() const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 0
+    Return Value: integer tag unique to all number objects
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/api/cpp/curve
===================================================================
--- trunk/examples/objects/api/cpp/curve	(revision 1581)
+++ trunk/examples/objects/api/cpp/curve	(revision 1581)
@@ -0,0 +1,327 @@
+Curve
+
+constructors/destructors
+    Curve()
+    Curve(const char *name);
+    Curve(const char *name, const char *label,
+            const char *desc, const char *group);
+    Curve(const Curve& o);
+    ~Curve ();
+
+methods
+    const char *name() const;
+    void name(const char *val);
+
+    const char *path() const;
+    void path(const char *val);
+
+    const char *label() const;
+    void label(const char *val);
+
+    const char *desc() const;
+    void desc(const char *val);
+
+    const char *hints() const;
+    void hints(const char *val);
+
+    const char *color() const;
+    void color(const char *val);
+
+    Array1D *axis(const char *name, const char *label,
+                  const char *desc, const char *units,
+                  const char *scale, const char *val, size_t size);
+
+    Curve& delAxis(const char *name);
+
+    size_t data(const char *label, const double **arr) const;
+
+    Array1D *getAxis(const char *name) const;
+
+    Array1D *getNthAxis(size_t n) const;
+
+    const char *group() const;
+    void group(const char *g);
+
+    size_t dims() const;
+
+    const void *property (const char *key) const;
+    void property (const char *key, const void *val, size_t nbytes);
+
+    const char *propstr (const char *key) const;
+    void propstr (const char *key, const char *val);
+
+    void propremove (const char *key);
+
+    void vvalue(void *storage, size_t numHints, va_list arg) const;
+
+    void configure(size_t as, ClientData c);
+    void dump(size_t as, ClientData c);
+
+    Outcome &outcome() const;
+
+    const int is() const;
+
+---------------------------------------
+
+const char *name()
+    Purpose: get the id name of the object
+    Input Arguments: None
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void name(const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 1
+        1. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *path()
+    Purpose: get the path of the object
+    Input Arguments: None
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void path(const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 1
+        1. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *label()
+    Purpose: get the label of the object
+    Input Arguments: None
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void label(const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 1
+        1. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *desc()
+    Purpose: get the description of the object
+    Input Arguments: None
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void desc(const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 1
+        1. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *hints()
+    Purpose: get the hints of the object
+    Input Arguments: None
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void hints(const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 1
+        1. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+Array1D *axis(const char *name, const char *label,
+              const char *desc, const char *units,
+              const char *scale, const char *val, size_t size);
+    Purpose: get a generic property from the property database
+    Input Arguments: 7
+        1. const char *name - axis id
+        2. const char *label - axis label
+        3. const char *desc - description of axis
+        4. const char *units - units of axis
+        5. const char *scale - scale of axis
+        6. const double *val - array of data values as doubles
+        7. size_t size - number of data values
+    Return Value: pointer to newly created Array1D object
+    Notes: valid options for scale are "log" and NULL. The newly
+           created Array1D object is stored in the Curve object.
+    Code Example:
+
+Curve& delAxis(const char *name);
+    Purpose: delete an axis stored in the object with the id
+                matching the string stored in "name".
+    Input Arguments: 1
+        1. const char *name - id of the axis to delete
+    Return Value: None
+    Notes: memory for the Array1D object is free'd
+    Code Example:
+
+size_t data(const char *label, const double **arr) const;
+    Purpose: retrieve the data associated with the axis named "label".
+    Input Arguments: 2
+        1. const char *label - name of axis holding the data
+        2. const double **arr - pointer to returned data
+    Return Value: number of elements in the returned array *arr
+    Notes: None
+    Code Example:
+
+Array1D *getAxis(const char *name) const;
+    Purpose: retrieve a pointer to a Array1D object representing
+                the axis named "name"
+    Input Arguments: 1
+        1. const char *name - name of the axis to retrieve
+    Return Value: pointer to Array1D object representing an axis
+    Notes: None
+    Code Example:
+
+Array1D *getNthAxis(size_t n) const;
+    Purpose: retrieve the n'th axis of this Curve object
+    Input Arguments: 1
+        1. size_t n - number of the axis to retrieve
+    Return Value: pointer to the n'th Array1D object
+    Notes: None
+    Code Example:
+
+const char *group() const;
+    Purpose: get the group this Curve object is associated with
+    Input Arguments: 0
+    Return Value: the group this Curve object is associated with
+    Notes: None
+    Code Example:
+
+void group(const char *g);
+    Purpose: set the group this Curve object is associated with
+    Input Arguments: 1
+        1. const char *g - newly associated group name
+    Return Value: None
+    Notes: None
+    Code Example:
+
+size_t dims() const;
+    Purpose: get the number of dimensions (axis)
+    Input Arguments: 0
+    Return Value: number of dimensions
+    Notes: None
+    Code Example:
+
+const void *property (const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void property (const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 3
+        1. const char *key - property name
+        2. const void *val - property value
+        3. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *propstr (const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void propstr (const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 2
+        1. const char *key - property name
+        2. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void propremove (const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void vvalue(void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 3
+        1. void *storage - the return value
+        2. size_t numHints - number of hints provided
+        3. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+void configure(size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void dump(size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 0
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int is() const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 0
+    Return Value: integer tag unique to all number objects
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/api/cpp/library
===================================================================
--- trunk/examples/objects/api/cpp/library	(revision 1581)
+++ trunk/examples/objects/api/cpp/library	(revision 1581)
@@ -0,0 +1,130 @@
+Library
+
+constructors/destructors
+    Library()
+    Library(const Library& o)
+    ~Library ()
+
+methods
+    Outcome &loadXml(const char *xmltext)
+    Outcome &loadFile(const char *filename)
+
+
+    Library &value(const char *key, void *storage,
+        size_t numHints, ...)
+
+    Rp_Chain *diff(Library *lib)
+
+    Library &remove (const char *key)
+
+    const char *xml() const
+
+    Outcome &outcome() const
+    int error() const
+
+    Outcome &result(int status)
+
+    const Rp_Chain *contains() const
+
+---------------------------------------
+
+Outcome &loadXml(const char *xmltext)
+    Purpose: parse the Rappture1.1 xml data in "xmltext".
+                populate this library object with the Rappture
+                objects described in the xml data.
+    Input Arguments: 1
+        1. const char *xmltext - Rappture1.1 xml data
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+Outcome &loadFile(const char *filename);
+    Purpose: read the file "filename" and parse the
+                Rappture1.1 xml data found inside of it.
+                populate this library object with the Rappture
+                objects described in the xml data.
+    Input Arguments: 1
+        1. const char *filename - file containing Rappture1.1
+                                    xml data
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+Library &value(const char *key, void *storage,
+    size_t numHints, ...);
+    Purpose: retrieve the value of the object named "key" and
+                store it in "storage". If there are hints,
+                pass them along to the object being retrieved
+                to tell it how the value should be configured.
+    Input Arguments: at least 3
+        1. const char *key - name of the object being retrieved
+        2. void *storage - where to place the value of the
+                            retrieved object
+        3. size_t numHints - number of hints provided
+        4. ... - hints listed as strings
+    Return Value: None
+    Notes: hints are listed as strings of the form
+            "hintKey=hintVal". hintKey is the key for the hint
+            and hintVal is the value to be applied to the hint.
+            generally, unrecognized hints are ignored. the hints
+            should be listed as comma separated strings in the
+            function's argument list.
+    Code Example:
+
+Rp_Chain *diff(Library *lib);
+    Purpose: find the difference between two library objects
+    Input Arguments: 1
+        1. Library *lib - other object used in comparison
+    Return Value: Linked list of differences
+    Notes: None
+    Code Example:
+
+Library &remove (const char *key);
+    Purpose: remove the object from this library named "key"
+    Input Arguments: 1
+        1. const char *key - name of the object to remove
+    Return Value: None
+    Notes: The object is removed and it's memory is deleted
+    Code Example:
+
+const char *xml() const;
+    Purpose: return the Rappture1.1 xml representation of the
+                objects stored in this library.
+    Input Arguments: 0
+    Return Value: None
+    Notes: user is responsible for free'ing returned memory?
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of the object
+    Input Arguments: 0
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+int error() const;
+    Purpose: return the status of the object
+    Input Arguments: 0
+    Return Value: status of the object
+    Notes: None
+    Code Example:
+
+Outcome &result(int status);
+    Purpose: write the stored objects to a data file and
+                signal the end of processing.
+    Input Arguments: 1
+        1. int status - status of the simulation
+    Return Value: None
+    Notes: currently data file are written out as Rappture1.1
+            xml. this function generates the RAPPTURE-RUN=>
+            signal.
+    Code Example:
+
+const Rp_Chain *contains() const;
+    Purpose: return a linked list of the Rappture objects
+                stored in this library.
+    Input Arguments: 0
+    Return Value: linked list of the Rappture objects stored in
+                    this library.
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/api/cpp/number
===================================================================
--- trunk/examples/objects/api/cpp/number	(revision 1581)
+++ trunk/examples/objects/api/cpp/number	(revision 1581)
@@ -0,0 +1,475 @@
+Number
+
+constructors/destructors
+    Number()
+    Number(const char *name, const char *units, double val);
+    Number(const char *name, const char *units, double val,
+           double min, double max, const char *label,
+           const char *desc);
+    Number(const Number& o);
+    ~Number ();
+
+methods
+    const char *name() const;
+    void name(const char *val);
+
+    const char *path() const;
+    void path(const char *val);
+
+    const char *label() const;
+    void label(const char *val);
+
+    const char *desc() const;
+    void desc(const char *val);
+
+    const char *hints() const;
+    void hints(const char *val);
+
+    const char *color() const;
+    void color(const char *val);
+
+    double def() const;
+    void def(double val);
+
+    double cur() const;
+    void cur(double val);
+
+    double min() const;
+    void min(double val);
+
+    double max() const;
+    void max(double val);
+
+    const char *units() const;
+    void units(const char *u);
+
+    int defset() const;
+    int curset() const;
+
+    const void *property (const char *key) const;
+    void property (const char *key, const void *val, size_t nbytes);
+
+    const char *propstr (const char *key) const;
+    void propstr (const char *key, const char *val);
+
+    void propremove (const char *key);
+
+    Outcome& convert(const char *to);
+    double value(const char *units) const;
+    void vvalue(void *storage, size_t numHints, va_list arg) const;
+
+    Number& addPreset(const char *label, const char *desc,
+                      double val, const char *units);
+
+    Number& addPreset(const char *label, const char *desc,
+                      const char *val);
+
+    Number& delPreset(const char *label);
+
+    void configure(size_t as, ClientData c);
+    void dump(size_t as, ClientData c);
+
+    Outcome &outcome() const;
+
+    const int is() const;
+
+    void minFromStr(const char *val);
+    void maxFromStr(const char *val);
+    void defFromStr(const char *val);
+    void curFromStr(const char *val);
+
+---------------------------------------
+
+const char *name()
+    Purpose: get the id name of the object
+    Input Arguments: None
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void name(const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 1
+        1. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *path()
+    Purpose: get the path of the object
+    Input Arguments: None
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void path(const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 1
+        1. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *label()
+    Purpose: get the label of the object
+    Input Arguments: None
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void label(const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 1
+        1. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *desc()
+    Purpose: get the description of the object
+    Input Arguments: None
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void desc(const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 1
+        1. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *hints()
+    Purpose: get the hints of the object
+    Input Arguments: None
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void hints(const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 1
+        1. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+double def()
+    Purpose: get the default value
+    Input Arguments: None
+    Return Value: the default value stored in the object.
+    Notes: use the function defset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void def(double val)
+    Purpose: set the default value
+    Input Arguments: 1
+        1. double val - new default value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double cur()
+    Purpose: get the current value
+    Input Arguments: None
+    Return Value: the current value stored in the object.
+    Notes: use the function curset() to see if a valid
+            default value was stored in the object.
+    Code Example:
+
+void cur(double val)
+    Purpose: set the current value
+    Input Arguments: 1
+        1. double val - new current value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double min()
+    Purpose: get the minimum accepted value of this object
+    Input Arguments: None
+    Return Value: the minimum value this object will accept.
+    Notes: use the function minset() to see if a valid
+            minimum value was stored in the object.
+    Code Example:
+
+void min(double val)
+    Purpose: set the minimum accepted value of this object
+    Input Arguments: 1
+        1. double val - new minimum accepted value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+double max()
+    Purpose: get the maximum accepted value of this object
+    Input Arguments: None
+    Return Value: the maximum value this object will accept.
+    Notes: use the function maxset() to see if a valid
+            maximum value was stored in the object.
+    Code Example:
+
+void max(double val)
+    Purpose: set the maximum accepted value of this object
+    Input Arguments: 1
+        1. double val - new maximum accepted value
+    Return Value: None
+    Notes: None
+    Code Example:
+
+const char* units()
+    Purpose: get the units of this object
+    Input Arguments: None
+    Return Value: the string representing the object's units
+    Notes: None
+    Code Example:
+
+void units(const char *val)
+    Purpose: set the units of this object
+    Input Arguments: 1
+        1. const char *val - new units
+    Return Value: None
+    Notes: None
+    Code Example:
+
+int defset() const
+    Purpose: return whether the default value was set by the user
+    Input Arguments: None
+    Return Value: 1 if default was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+int curset() const
+    Purpose: return whether the current value was set by the user
+    Input Arguments: None
+    Return Value: 1 if current was set by user, otherwise 0
+    Notes: None
+    Code Example:
+
+const void *property (const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void property (const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 3
+        1. const char *key - property name
+        2. const void *val - property value
+        3. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *propstr (const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void propstr (const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 2
+        1. const char *key - property name
+        2. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void propremove (const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+Outcome& convert(const char *to);
+    Purpose: convert the def and cur values to "to" units
+    Input Arguments: 1
+        1. const char *to - string of units to convert to
+    Return Value: Outcome object
+    Notes: the values stored in the object are changed
+    Code Example:
+
+double value(const char *to) const;
+    Purpose: return the value of the object with units of "to"
+    Input Arguments: 1
+        1. const char *to - string of units to convert to
+    Return Value: value of the object
+    Notes: cur() is used as the base value. if cur was not set
+            by the user (curset() == 0), def() is used.
+            if def was not set (defset() == 0), 0.0 is used
+            as the value.
+    Code Example:
+
+void vvalue(void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 3
+        1. void *storage - the return value
+        2. size_t numHints - number of hints provided
+        3. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+Number& addPreset(const char *label, const char *desc,
+                  double val, const char *units);
+    Purpose: add a preset to this object
+    Input Arguments: 4
+        1. const char *label - label of the preset
+        2. const char *desc - description of the preset
+        3. double val - value of the preset
+        4. const char *units - units of the preset
+    Return Value: None
+    Notes: presets are stored in the object in the same order
+                in which they are created
+    Code Example:
+
+Number& addPreset(const char *label, const char *desc,
+                  const char *val);
+    Purpose: add a preset to this object
+    Input Arguments: 3
+        1. const char *label - label of the preset
+        2. const char *desc - description of the preset
+        3. const char *val - numeric value and units of the preset
+    Return Value: None
+    Notes: presets are stored in the object in the same order
+                in which they are created
+    Code Example:
+
+Number& delPreset(const char *label);
+    Purpose: delete the preset labeled "label" from this object
+    Input Arguments: 1
+        1. const char *label - label of the preset
+    Return Value: None
+    Notes: preset is removed from the object
+    Code Example:
+
+void configure(size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void dump(size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 0
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int is() const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 0
+    Return Value: integer tag unique to all number objects
+    Notes: None
+    Code Example:
+
+void minFromStr(const char *val);
+    Purpose: populate the min() value from a string.
+    Input Arguments: 1
+        1. const char *val - value and units for the
+                                minimum value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in min().
+    Code Example:
+
+void maxFromStr(const char *val);
+    Purpose: populate the max() value from a string.
+    Input Arguments: 1
+        1. const char *val - value and units for the
+                                maximum value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in max().
+    Code Example:
+
+void defFromStr(const char *val);
+    Purpose: populate the def() value from a string.
+    Input Arguments: 1
+        1. const char *val - value and units for the
+                                default value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in def().
+    Code Example:
+
+void curFromStr(const char *val);
+    Purpose: populate the cur() value from a string.
+    Input Arguments: 1
+        1. const char *val - value and units for the
+                                current value
+    Return Value: None
+    Notes: This function tries to parse the string for a value
+            and a units string. if a units string is found and
+            no units have been set for the object, these units
+            become the units for the object. if there are
+            already units for this object, any value found
+            during the split is converted to the object's
+            units before being stored in cur().
+    Code Example:
Index: trunk/examples/objects/api/cpp/plot
===================================================================
--- trunk/examples/objects/api/cpp/plot	(revision 1581)
+++ trunk/examples/objects/api/cpp/plot	(revision 1581)
@@ -0,0 +1,292 @@
+Plot
+
+constructors/destructors
+    Plot()
+    Plot(Library *lib)
+    Plot(const Plot& o);
+    ~Plot ();
+
+methods
+    const char *name() const;
+    void name(const char *val);
+
+    const char *path() const;
+    void path(const char *val);
+
+    const char *label() const;
+    void label(const char *val);
+
+    const char *desc() const;
+    void desc(const char *val);
+
+    const char *hints() const;
+    void hints(const char *val);
+
+    const char *color() const;
+    void color(const char *val);
+
+    const void *property (const char *key) const;
+    void property (const char *key, const void *val, size_t nbytes);
+
+    const char *propstr (const char *key) const;
+    void propstr (const char *key, const char *val);
+
+    void propremove (const char *key);
+
+    Plot& add ( size_t nPts, double *x, double *y,
+                const char *fmt, const char *name);
+
+    Plot& add (Curve *c, const char *name);
+
+    size_t count() const;
+
+    Curve *curve (const char* name) const;
+    Curve *getNthCurve(size_t n) const;
+
+    void vvalue(void *storage, size_t numHints, va_list arg) const;
+
+    void configure(size_t as, ClientData c);
+    void dump(size_t as, ClientData c);
+
+    Outcome &outcome() const;
+
+    const int is() const;
+
+---------------------------------------
+
+const char *name()
+    Purpose: get the id name of the object
+    Input Arguments: None
+    Return Value: the id name stored in the object.
+    Notes: if no name is set, NULL will be returned
+            the id name is used to identify this object from
+            all other objects and should be unique
+    Code Example:
+
+void name(const char *val)
+    Purpose: set the id name of the object
+    Input Arguments: 1
+        1. const char *val - new id name
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *path()
+    Purpose: get the path of the object
+    Input Arguments: None
+    Return Value: the path stored in the object.
+    Notes: if no path is set, NULL will be returned
+            the path tells where this object sits in the
+            hierarchy of objects.
+    Code Example:
+
+void path(const char *val)
+    Purpose: set the path of the object
+    Input Arguments: 1
+        1. const char *val - new path
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *label()
+    Purpose: get the label of the object
+    Input Arguments: None
+    Return Value: the label stored in the object.
+    Notes: if no label is set, NULL will be returned
+            the label is used by the graphical user interface.
+    Code Example:
+
+void label(const char *val)
+    Purpose: set the label of the object
+    Input Arguments: 1
+        1. const char *val - new label
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *desc()
+    Purpose: get the description of the object
+    Input Arguments: None
+    Return Value: the description stored in the object.
+    Notes: if no description is set, NULL will be returned
+            the description is used by the graphical user
+            interface to describe what type of data is being
+            requested and how the input is used.
+    Code Example:
+
+void desc(const char *val)
+    Purpose: set the description of the object
+    Input Arguments: 1
+        1. const char *val - new description
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const char *hints()
+    Purpose: get the hints of the object
+    Input Arguments: None
+    Return Value: the hints stored in the object.
+    Notes: if no hints are set, NULL will be returned
+            the hints are used by the graphical user interface
+    Code Example:
+
+void hints(const char *val)
+    Purpose: set the hints of the object
+    Input Arguments: 1
+        1. const char *val - new hints
+    Return Value: None
+    Notes: a copy of the memory location val will be stored
+    Code Example:
+
+const void *property (const char *key) const;
+    Purpose: get a generic property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void property (const char *key, const void *val, size_t nbytes);
+    Purpose: set a generic property in the property database
+    Input Arguments: 3
+        1. const char *key - property name
+        2. const void *val - property value
+        3. size_t nbytes - size (in bytes) of the value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+const char *propstr (const char *key) const;
+    Purpose: get a string property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+void propstr (const char *key, const char *val);
+    Purpose: set a string property in the property database
+    Input Arguments: 2
+        1. const char *key - property name
+        2. const char *val - property value
+    Return Value: None
+    Notes: A copy of the memory pointed to by val is stored
+            in the property database
+    Code Example:
+
+void propremove (const char *key);
+    Purpose: remove a property from the property database
+    Input Arguments: 1
+        1. const char *key - property name
+    Return Value: value of the property
+    Notes: None
+    Code Example:
+
+Plot& add (size_t nPts, double *x, double *y,
+           const char *fmt, const char *name);
+    Purpose: add data for an xy curve to the plot
+    Input Arguments: 5
+        1. size_t nPts - number of points in the x and y arrays
+        2. double *x - pointer to array representing the x axis
+        3. double *y - pointer to array representing the y axis
+        4. const char *fmt - format of the line
+        5. const char *name - id of the newly created curve
+    Return Value: reference to a Plot object
+    Notes: format can be something like "g:o" to represent
+            green line, dotted line style, circle marker.
+            this follows matlab's formatting rules.
+    Code Example:
+
+Plot& add (Curve *c, const char *name);
+    Purpose: add a Curve object to this Plot object
+    Input Arguments: 2
+        1. Curve *c - Curve object to add
+        2. const char *name - id of the Curve object
+    Return Value: reference to a Plot object
+    Notes: Curve object should not be deleted by user?
+    Code Example:
+
+size_t count() const;
+    Purpose: retrieve the number of curves in this Plot object
+    Input Arguments: 0
+    Return Value: number of curves stored in the object
+    Notes: None
+    Code Example:
+
+Curve *curve (const char* name) const;
+    Purpose: retrieve the curve with the id matching "name"
+    Input Arguments: 1
+        1. const char *name - id to Curve to be retrieved
+    Return Value: pointer to Curve object matching "name" or NULL
+    Notes: None
+    Code Example:
+
+Curve *getNthCurve(size_t n) const;
+    Purpose: return the n'th curve stored in the object
+    Input Arguments: 1
+        1. size_t n - number of the curve to retrieve
+    Return Value: pointer to the n'th Curve object stored in
+                    the Plot object or NULL
+    Notes: None
+    Code Example:
+
+void vvalue(void *storage, size_t numHints, va_list arg) const;
+    Purpose: return the value of the object after applying a
+                varying number of hints about how the value
+                should be configured
+    Input Arguments: 3
+        1. void *storage - the return value
+        2. size_t numHints - number of hints provided
+        3. va_list arg - list of hints specified as a va_list
+    Return Value: None
+    Notes: vvalue will parse out the recognisable hints from
+                va_list arg. Values stored in the object are
+                not changed.
+    Code Example:
+
+void configure(size_t as, ClientData c);
+    Purpose: configure the object based on the data in "c".
+                use "as" to determine the type of data in "c".
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    const char *xmltext
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: object is configured based on values in "c"
+    Code Example:
+
+void dump(size_t as, ClientData c);
+    Purpose: dump the object values based to the object "c".
+                use "as" to determine how to dump the data.
+    Input Arguments: 2
+        1. size_t as - type of data stored in "c".
+                        valid values include:
+                            RPCONFIG_XML
+                            RPCONFIG_TREE
+        2. ClientData c - data to configure the object from.
+                            if as is...     then c should be...
+                            RPCONFIG_XML    ClientDataXml *object
+                            RPCONFIG_TREE   RP_ParserXML *object
+    Return Value: None
+    Notes: None
+    Code Example:
+
+Outcome &outcome() const;
+    Purpose: return the status of this object as an Outcome.
+    Input Arguments: 0
+    Return Value: status of the object as an Outcome
+    Notes: None
+    Code Example:
+
+const int is() const;
+    Purpose: return an integer tag describing the object.
+    Input Arguments: 0
+    Return Value: integer tag unique to all plot objects
+    Notes: None
+    Code Example:
Index: trunk/examples/objects/app-fermi/fermi4.c
===================================================================
--- trunk/examples/objects/app-fermi/fermi4.c	(revision 1581)
+++ trunk/examples/objects/app-fermi/fermi4.c	(revision 1581)
@@ -0,0 +1,90 @@
+
+// ----------------------------------------------------------------------
+//  EXAMPLE: Fermi-Dirac function in Python.
+//
+//  This simple example shows how to use Rappture within a simulator
+//  written in C.
+// ======================================================================
+//  AUTHOR:  Derrick Kearney, Purdue University
+//  Copyright (c) 2005-2009  Purdue Research Foundation
+//
+//  See the file "license.terms" for information on usage and
+//  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+// ======================================================================
+
+#include "rappture.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <unistd.h>
+
+int main(int argc, char * argv[]) {
+
+    Rappture_Library *lib = NULL;
+    Rappture_Number *T = NULL;
+
+    double Ef         = 0.0;
+    double E          = 0.0;
+    double dE         = 0.0;
+    double kT         = 0.0;
+    double Emin       = 0.0;
+    double Emax       = 0.0;
+    double f          = 0.0;
+    size_t nPts       = 200;
+    double EArr[nPts];
+    double fArr[nPts];
+
+    const char *curveLabel = "Fermi-Dirac Curve"
+    const char *curveDesc = "Plot of Fermi-Dirac Calculation";
+
+    Rappture::Plot *p1 = NULL;
+
+    // create a rappture library from the file filePath
+    lib = Rappture_Library_init(argv[1]);
+
+    if (Rappture_Library_error(lib) != 0) {
+        // cannot open file or out of memory
+        fprintf(stderr,Rappture_Library_traceback(lib));
+        return(Rappture_Library_error(lib));
+    }
+
+    Rappture_connect(lib,"temperature",T);
+    Rappture_Library_value(lib,"Ef",&Ef,"units=eV");
+
+    if (Rappture_Library_error(lib) != 0) {
+        // there were errors while retrieving input data values
+        // dump the tracepack
+        fprintf(stderr,Rappture_Library_traceback(lib));
+        return(Rappture_Library_error(lib));
+    }
+
+    kT = 8.61734e-5 * Rappture_Number_value(T,"K");
+    Emin = Ef - 10*kT;
+    Emax = Ef + 10*kT;
+
+    dE = 0.005*(Emax-Emin);
+
+    E = Emin;
+    for(size_t idx = 0; idx < nPts; idx++) {
+        E = E + dE;
+        f = 1.0/(1.0 + exp((E - Ef)/kT));
+        fArr[idx] = f;
+        EArr[idx] = E;
+        Rappture_Utils_Progress((int)((E-Emin)/(Emax-Emin)*100),"Iterating");
+    }
+
+    // do it the easy way,
+    // create a plot to add to the library
+    // plot is registered with lib upon object creation
+    // p1->add(nPts,xArr,yArr,format,curveLabel,curveDesc);
+
+    p1 = Rappture_Plot_init(lib);
+    Rappture_Plot_add(p1,nPts,fArr,EArr,"",curveLabel,curveDesc);
+    Rappture_Plot_propstr(p1,"xlabel","Fermi-Dirac Factor");
+    Rappture_Plot_propstr(p1,"ylabel","Energy");
+    Rappture_Plot_propstr(p1,"yunits","eV");
+
+    Rappture_Library_result(lib);
+    return 0;
+}
Index: trunk/examples/objects/app-fermi/fermi4.cc
===================================================================
--- trunk/examples/objects/app-fermi/fermi4.cc	(revision 1569)
+++ trunk/examples/objects/app-fermi/fermi4.cc	(revision 1581)
@@ -23,28 +23,34 @@
     // create a rappture library from the file filePath
     Rappture::Library lib(argv[1]);
+    Rappture::Number *T;
 
-    Rappture::Number T;
     double Ef           = 0.0;
+    double E            = 0.0;
     double dE           = 0.0;
     double kT           = 0.0;
     double Emin         = 0.0;
     double Emax         = 0.0;
+    double f            = 0.0;
     size_t nPts         = 200;
-    double E[nPts];
-    double f[nPts];
+    double EArr[nPts];
+    double fArr[nPts];
 
     if (lib.error() != 0) {
         // cannot open file or out of memory
-        fprintf(stderr, lib.traceback());
+        Rappture::Outcome o = lib.outcome();
+        fprintf(stderr, "%s",o.context());
+        fprintf(stderr, "%s",o.remark());
         exit(lib.error());
     }
 
-    Rappture::connect(&lib,"temperature",&T);
-    lib.value("Ef", &Ef, "units=eV");
+    Rappture::connect(&lib,"temperature",T);
+    lib.value("Ef", &Ef, 1, "units=eV");
 
     if (lib.error() != 0) {
         // there were errors while retrieving input data values
         // dump the tracepack
-        fprintf(stderr, lib.traceback());
+        Rappture::Outcome o = lib.outcome();
+        fprintf(stderr, "%s",o.context());
+        fprintf(stderr, "%s",o.remark());
         exit(lib.error());
     }
@@ -71,5 +77,5 @@
     // create a plot to add to the library
     // plot is registered with lib upon object creation
-    // p1->add(nPts,xArr,yArr,format,curveLabel,curveDesc);
+    // p1.add(nPts,xArr,yArr,format,curveLabel,curveDesc);
 
     Rappture::Plot p1(lib);
Index: trunk/examples/objects/app-fermi/fermi4.m
===================================================================
--- trunk/examples/objects/app-fermi/fermi4.m	(revision 1581)
+++ trunk/examples/objects/app-fermi/fermi4.m	(revision 1581)
@@ -0,0 +1,67 @@
+% ----------------------------------------------------------------------
+%  EXAMPLE: Fermi-Dirac function in Octave.
+%
+%  This script represents a newly written application with rappture 
+%  bindings and interface.
+%
+% ======================================================================
+%  AUTHOR:  Derrick Kearney, Purdue University
+%  Copyright (c) 2005-2009  Purdue Research Foundation
+%
+%  See the file "license.terms" for information on usage and
+%  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+% ======================================================================
+
+% get out input file from the command line
+% invoke this script with the following command:
+% matlab -nodisplay -r infile=\'driver1234.xml\',fermi
+% the above command sets variable infile to the name 'driver1234.xml'
+
+% infile = 'driver31619.xml'
+
+% open our xml input file.
+lib = Rappture_Library(infile);
+
+nPts = 200;
+
+if (Rappture_Library_error(lib) == 0)) {
+    % cannot open file or out of memory
+    fprintf(stderr, Rappture_Library_traceback(lib));
+    exit(Rappture_Library_error(lib));
+}
+
+T = Rappture_connect(lib,'temperature');
+Ef = Rappture_Library_value(lib,'Ef','units=eV');
+
+if (Rappture_Library_error(lib) == 0) {
+    % there were errors while retrieving input data values
+    % dump the tracepack
+    fprintf(stderr,Rappture_Library_traceback(lib));
+}
+
+% do fermi calculations (science)...
+kT = 8.61734e-5 * Rappture_Number_value(T,'K');
+Emin = Ef - 10*kT;
+Emax = Ef + 10*kT;
+
+EArr = linspace(Emin,Emax,nPts);
+fArr = 1.0 ./ (1.0 + exp((E - Ef)/kT));
+
+
+curveLabel = 'Fermi-Dirac Curve';
+curveDesc = 'Plot of Fermi-Dirac Calculation';
+
+% do it the easy way,
+% create a plot to add to the library
+% plot is registered with lib upon object creation
+% p1->add(nPts,xArr,yArr,format,curveLabel,curveDesc);
+
+p1 = Rappture_Plot(lib);
+Rappture_Plot_add(p1,nPts,fArr,EArr,"",curveLabel,curveDesc);
+Rappture_Plot_propstr(p1,"xlabel","Fermi-Dirac Factor");
+Rappture_Plot_propstr(p1,"ylabel","Energy");
+Rappture_Plot_propstr(p1,"yunits","eV");
+
+Rappture_Library_result(lib);
+
+quit;
Index: trunk/examples/objects/app-fermi/fermi4.py
===================================================================
--- trunk/examples/objects/app-fermi/fermi4.py	(revision 1581)
+++ trunk/examples/objects/app-fermi/fermi4.py	(revision 1581)
@@ -0,0 +1,122 @@
+#! /usr/bin/env python
+# ----------------------------------------------------------------------
+#  EXAMPLE: Fermi-Dirac function in C++.
+#
+#  This simple example shows how to use Rappture within a simulator
+#  written in C++.
+# ======================================================================
+#  AUTHOR:  Derrick Kearney, Purdue University
+#  Copyright (c) 2005-2009  Purdue Research Foundation
+#
+#  See the file "license.terms" for information on usage and
+#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+# ======================================================================
+
+
+import sys
+import os
+import getopt
+
+import Rappture
+from math import *
+
+
+def help(argv=sys.argv):
+    return """%(prog)s [-h]
+
+     -h | --help       - print the help menu
+
+     Examples:
+       %(prog)s
+
+""" % {'prog':os.path.basename(argv[0])}
+
+def main(argv=None):
+
+    if argv is None:
+        argv = sys.argv
+
+    if len(argv) < 1:
+        msg = "%(prog)s requires at least 0 argument" % {'prog':argv[0]}
+        print >>sys.stderr, msg
+        print >>sys.stderr, help()
+        return 2
+
+    longOpts = ["help"]
+    shortOpts = "h"
+    try:
+        opts,args = getopt.getopt(argv[1:],shortOpts,longOpts)
+    except getopt.GetOptError, msg:
+        print >>sys.stderr, msg
+        print >>sys.stderr, help()
+        return 2
+
+
+
+    # create a rappture library from the file filePath
+    lib = Rappture.Library(argv[1])
+
+#    T = Rappture.Number();
+#    Ef = 0.0;
+#    dE = 0.0;
+#    kT = 0.0;
+#    Emin = 0.0;
+#    Emax = 0.0;
+    nPts = 200;
+    EArr = list() # [nPts];
+    fArr = list() # [nPts];
+
+    if (lib.error() != 0) {
+        # cannot open file or out of memory
+        print >>sys.stderr, lib.traceback()
+        exit(lib.error());
+    }
+
+    T = Rappture.connect(lib,"temperature");
+    Ef = lib.value("Ef","units=eV");
+
+    if (lib.error() != 0) {
+        # there were errors while retrieving input data values
+        # dump the tracepack
+        print >>sys.stderr, lib.traceback()
+        exit(lib.error());
+    }
+
+    kT = 8.61734e-5 * T.value("K");
+    Emin = Ef - 10*kT;
+    Emax = Ef + 10*kT;
+
+    dE = (1.0/nPts)*(Emax-Emin);
+
+    E = Emin;
+    for (size_t idx = 0; idx < nPts; idx++) {
+        E = E + dE;
+        f = 1.0/(1.0 + exp((E - Ef)/kT));
+        fArr.append(f);
+        EArr.append(E);
+        Rappture.Utils.progress((int)((E-Emin)/(Emax-Emin)*100),"Iterating");
+    }
+
+    curveLabel = "Fermi-Dirac Curve"
+    curveDesc = "Plot of Fermi-Dirac Calculation";
+
+    # do it the easy way,
+    # create a plot to add to the library
+    # plot is registered with lib upon object creation
+    # p1->add(nPts,xArr,yArr,format,curveLabel,curveDesc);
+
+    p1 = Rappture.Plot(lib);
+    p1.add(nPts,fArr,EArr,"",curveLabel,curveDesc);
+    p1.propstr("xlabel","Fermi-Dirac Factor");
+    p1.propstr("ylabel","Energy");
+    p1.propstr("yunits","eV");
+
+    lib.result();
+
+    return 0;
+}
+
+
+if __name__ == '__main__':
+    sys.exit(main())
+
Index: trunk/examples/objects/app-fermi/fermi4.tcl
===================================================================
--- trunk/examples/objects/app-fermi/fermi4.tcl	(revision 1581)
+++ trunk/examples/objects/app-fermi/fermi4.tcl	(revision 1581)
@@ -0,0 +1,68 @@
+# ----------------------------------------------------------------------
+#  EXAMPLE: Fermi-Dirac function in Tcl.
+#
+#  This simple example shows how to use Rappture within a simulator
+#  written in Tcl.
+# ======================================================================
+#  AUTHOR:  Derrick Kearney, Purdue University
+#  Copyright (c) 2005-2009  Purdue Research Foundation
+#
+#  See the file "license.terms" for information on usage and
+#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+# ======================================================================
+package require Rappture
+
+# open the XML file containing the run parameters
+set lib [Rappture::Library [lindex $argv 0]]
+
+if {[$lib error] != 0} {
+    # cannot open file or out of memory
+    puts stderr [$lib traceback]
+    exit [$lib error]
+}
+
+set T [Rappture::connect $lib "temperature"]
+set Ef [$lib value "Ef" "units=eV"]
+
+if {[$lib error != 0]} {
+    # there were errors while retrieving input data values
+    # dump the tracepack
+    puts stderr [$lib traceback]
+    exit [$lib error]
+}
+
+set nPts 200
+
+set kT [expr {8.61734e-5 * [$T value "K"]}]
+set Emin [expr {$Ef - 10*$kT}]
+set Emax [expr {$Ef + 10*$kT}]
+
+set dE [expr {0.005*($Emax-$Emin)}]
+
+set E $Emin
+for {set idx 0} {idx < nPts} {incr idx} {
+    set E [expr {$E + $dE}]
+    set f [expr {1.0/(1.0 + exp(($E - $Ef)/$kT))}]
+    lappend fArr $f
+    lappend Err $E
+    set progress [expr {(($E - $Emin)/($Emax - $Emin)*100)}]
+    Rappture::Utils::progress $progress -mesg "Iterating"
+}
+
+set curveLabel "Fermi-Dirac Curve"
+set curveDesc "Plot of Fermi-Dirac Calculation"
+
+# do it the easy way,
+# create a plot to add to the library
+# plot is registered with lib upon object creation
+# p1->add(nPts,xArr,yArr,format,curveLabel,curveDesc);
+
+set p1 [Rappture::Plot $lib]
+$p1 add $nPts $fArr $EArr "" $curveLabel $curveDesc
+$p1 propstr "xlabel" "Fermi-Dirac Factor"
+$p1 propstr "ylabel" "Energy"
+$p1 propstr "yunits" "eV"
+
+$lib result
+
+exit 0
Index: trunk/examples/objects/library/library.cc
===================================================================
--- trunk/examples/objects/library/library.cc	(revision 1569)
+++ trunk/examples/objects/library/library.cc	(revision 1581)
@@ -1,11 +1,11 @@
 #include <iostream>
-#include <errno.h>
 #include "RpLibObj.h"
 #include "RpInt.h"
 #include "RpChain.h"
+#include "RpTest.h"
 
 int library_0_0 ()
 {
-    const char *testdesc = "test creating library object";
+    const char *testdesc = "test creating library object with loadFile()";
     const char *testname = "library_0_0";
     const char *filePath = "library_0_0_in.xml";
@@ -13,106 +13,328 @@
 
     Rappture::Library lib;
+
+    lib.loadFile(filePath);
+
+    const char *expected = NULL;
+
+    readFile(filePath, &expected);
+    const char *received = lib.xml();
+
+    retVal |= testStringVal(testname,testdesc,expected,received);
+
+    delete expected;
+
+    return retVal;
+}
+
+int library_0_1 ()
+{
+    const char *testdesc = "test creating library object with loadXml()";
+    const char *testname = "library_0_1";
+    int retVal = 0;
+
+    Rappture::Library lib;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\n\
+<run>\n\
+    <input>\n\
+        <number id=\"Ef\">\n\
+            <about>\n\
+                <label>Fermi Level</label>\n\
+                <description>Energy at center of distribution.</description>\n\
+            </about>\n\
+            <units>eV</units>\n\
+            <min>-10eV</min>\n\
+            <max>10eV</max>\n\
+            <default>0eV</default>\n\
+            <current>5eV</current>\n\
+            <preset>\n\
+                <label>300K (room temperature)</label>\n\
+                <value>300K</value>\n\
+            </preset>\n\
+            <preset>\n\
+                <label>77K (liquid nitrogen)</label>\n\
+                <value>77K</value>\n\
+            </preset>\n\
+            <preset>\n\
+                <label>4.2K (liquid helium)</label>\n\
+                <value>4.2K</value>\n\
+            </preset>\n\
+        </number>\n\
+    </input>\n\
+</run>\n\
+";
+
+    lib.loadXml(buf);
+
+    const char *expected = buf;
+    const char *received = lib.xml();
+
+    retVal |= testStringVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_1_0 ()
+{
+    const char *testdesc = "test contains() function on empty library";
+    const char *testname = "library_1_0";
+    int retVal = 0;
+
+    Rappture::Library lib;
     const Rp_Chain *contents = NULL;
-
-    lib.loadFile(filePath);
     contents = lib.contains();
 
-    std::printf("lib contains %d item(s)\n", Rp_ChainGetLength(contents));
-
-    return retVal;
-}
-
-int library_1_0 ()
-{
-    const char *testdesc = "test creating library object";
-    const char *testname = "library_1_0";
-    const char *filePath = "library_0_0_in.xml";
+    int expected = 0;
+    int received = Rp_ChainGetLength(contents);
+
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_1_1 ()
+{
+    const char *testdesc = "test contains() function on populated library";
+    const char *testname = "library_1_1";
     int retVal = 0;
 
     Rappture::Library lib;
     const Rp_Chain *contents = NULL;
-
-    lib.loadFile(filePath);
-
-    const char *xmltext = lib.xml();
-    printf("xmltext = %s\n",xmltext);
-
-    return retVal;
-}
-
-/*
-int number_0_1 ()
-{
-    const char *testdesc = "test number constuctor";
-    const char *testname = "number_0_0";
-    int retVal = 0;
-
-    const char *name = "eV";
-    const char *units = "eV";
-    double def = 1.4;
-
-    Rappture::Number *n = NULL;
-
-    n = new Rappture::Number(name,units,def);
-
-    if (n == NULL) {
-        printf("Error: %s\n", testname);
-        printf("\t%s\n", testdesc);
-        printf("\terror creating number object\n");
-        retVal = 1;
-    }
-
-    retVal |= testStringVal(testname,testdesc,name,n->name());
-    retVal |= testStringVal(testname,testdesc,units,n->units());
-    retVal |= testDoubleVal(testname,testdesc,def,n->def());
-
-    if (n != NULL) {
-        delete n;
-    }
-
-    return retVal;
-}
-
-int number_1_0 ()
-{
-    const char *testdesc = "test constructing number from xml";
-    const char *testname = "number_1_0";
-    const char *filePath = "number_1_0_in.xml";
-    int retVal = 0;
-
-    const char *buf = NULL;
-    readFile(filePath,&buf);
-
-    const char *name = "Ef";
-    const char *units = "eV";
-    double def = 0;
-    double cur = 5;
-    double min = -10;
-    double max = 10;
-    const char *label = "Fermi Level";
-    const char *desc = "Energy at center of distribution.";
-
-    Rappture::Number n;
-
-    n.xml(buf);
-
-    retVal |= testStringVal(testname,testdesc,name,n.name());
-    retVal |= testStringVal(testname,testdesc,units,n.units());
-    retVal |= testDoubleVal(testname,testdesc,def,n.def());
-    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
-    retVal |= testDoubleVal(testname,testdesc,min,n.min());
-    retVal |= testDoubleVal(testname,testdesc,max,n.max());
-    retVal |= testStringVal(testname,testdesc,label,n.label());
-    retVal |= testStringVal(testname,testdesc,desc,n.desc());
-
-    return retVal;
-}
-*/
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<run>\
+    <input>\
+        <number id=\"Ef\">\
+            <about>\
+                <label>Fermi Level</label>\
+                <description>Energy at center of distribution.</description>\
+            </about>\
+            <units>eV</units>\
+            <min>-10eV</min>\
+            <max>10eV</max>\
+            <default>0eV</default>\
+            <current>5eV</current>\
+            <preset>\
+                <value>300K</value>\
+                <label>300K (room temperature)</label>\
+            </preset>\
+            <preset>\
+                <value>77K</value>\
+                <label>77K (liquid nitrogen)</label>\
+            </preset>\
+            <preset>\
+                <value>4.2K</value>\
+                <label>4.2K (liquid helium)</label>\
+            </preset>\
+        </number>\
+    </input>\
+</run>";
+
+    lib.loadXml(buf);
+    contents = lib.contains();
+
+    int expected = 1;
+    int received = Rp_ChainGetLength(contents);
+
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_2_0 ()
+{
+    const char *testdesc = "test value(), 0 hints";
+    const char *testname = "library_2_0";
+    int retVal = 0;
+
+    Rappture::Library lib;
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<run>\
+    <input>\
+        <number id=\"temperature\">\
+            <about>\
+                <label>Ambient temperature</label>\
+                <description>Temperature of the environment.</description>\
+            </about>\
+            <units>K</units>\
+            <min>0K</min>\
+            <max>500K</max>\
+            <default>300K</default>\
+        </number>\
+        <number id=\"Ef\">\
+            <about>\
+                <label>Fermi Level</label>\
+                <description>Energy at center of distribution.</description>\
+            </about>\
+            <units>eV</units>\
+            <min>-10eV</min>\
+            <max>10eV</max>\
+            <default>4eV</default>\
+        </number>\
+    </input>\
+</run>";
+
+    lib.loadXml(buf);
+
+    double expected = 4.0;
+    double received = 0.0;
+    lib.value("Ef",&received,0);
+
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_2_1 ()
+{
+    const char *testdesc = "test value(), 1 hint, units=eV";
+    const char *testname = "library_2_1";
+    int retVal = 0;
+
+    Rappture::Library lib;
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<run>\
+    <input>\
+        <number id=\"temperature\">\
+            <about>\
+                <label>Ambient temperature</label>\
+                <description>Temperature of the environment.</description>\
+            </about>\
+            <units>K</units>\
+            <min>0K</min>\
+            <max>500K</max>\
+            <default>300K</default>\
+        </number>\
+        <number id=\"Ef\">\
+            <about>\
+                <label>Fermi Level</label>\
+                <description>Energy at center of distribution.</description>\
+            </about>\
+            <units>eV</units>\
+            <min>-10eV</min>\
+            <max>10eV</max>\
+            <default>4eV</default>\
+        </number>\
+    </input>\
+</run>";
+
+    lib.loadXml(buf);
+
+    double expected = 4.0;
+    double received = 0.0;
+    lib.value("Ef",&received,1,"units=eV");
+
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_2_2 ()
+{
+    const char *testdesc = "test value(), 1 hint, units=J";
+    const char *testname = "library_2_2";
+    int retVal = 0;
+
+    Rappture::Library lib;
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<run>\
+    <input>\
+        <number id=\"temperature\">\
+            <about>\
+                <label>Ambient temperature</label>\
+                <description>Temperature of the environment.</description>\
+            </about>\
+            <units>K</units>\
+            <min>0K</min>\
+            <max>500K</max>\
+            <default>300K</default>\
+        </number>\
+        <number id=\"Ef\">\
+            <about>\
+                <label>Fermi Level</label>\
+                <description>Energy at center of distribution.</description>\
+            </about>\
+            <units>eV</units>\
+            <min>-10eV</min>\
+            <max>10eV</max>\
+            <default>4eV</default>\
+        </number>\
+    </input>\
+</run>";
+
+    lib.loadXml(buf);
+
+    // double expected = 6.40871e-19;
+    double expected = 4*1.602177e-19;
+    double received = 0.0;
+    lib.value("Ef",&received,1,"units=J");
+
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
+
+int library_2_3 ()
+{
+    const char *testdesc = "test value(), object does not exist";
+    const char *testname = "library_2_3";
+    int retVal = 0;
+
+    Rappture::Library lib;
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<run>\
+    <input>\
+        <number id=\"temperature\">\
+            <about>\
+                <label>Ambient temperature</label>\
+                <description>Temperature of the environment.</description>\
+            </about>\
+            <units>K</units>\
+            <min>0K</min>\
+            <max>500K</max>\
+            <default>300K</default>\
+        </number>\
+        <number id=\"Ef\">\
+            <about>\
+                <label>Fermi Level</label>\
+                <description>Energy at center of distribution.</description>\
+            </about>\
+            <units>eV</units>\
+            <min>-10eV</min>\
+            <max>10eV</max>\
+            <default>4eV</default>\
+        </number>\
+    </input>\
+</run>";
+
+    lib.loadXml(buf);
+
+    // library should not change the value of received
+    // if it cannot find the requested object
+    double expected = -101.01;
+    double received = -101.01;
+    lib.value("EF",&received,1,"units=J");
+
+    retVal |= testDoubleVal(testname,testdesc,1,lib.error());
+    retVal |= testDoubleVal(testname,testdesc,expected,received);
+
+    return retVal;
+}
 
 int main()
 {
     library_0_0();
-    // library_0_1();
+    library_0_1();
     library_1_0();
+    library_2_0();
+    library_2_1();
+    library_2_2();
+    library_2_3();
 
     return 0;
Index: trunk/examples/objects/library/library_0_0_in.xml
===================================================================
--- trunk/examples/objects/library/library_0_0_in.xml	(revision 1569)
+++ trunk/examples/objects/library/library_0_0_in.xml	(revision 1581)
@@ -13,14 +13,14 @@
             <current>5eV</current>
             <preset>
+                <label>300K (room temperature)</label>
                 <value>300K</value>
-                <label>300K (room temperature)</label>
             </preset>
             <preset>
+                <label>77K (liquid nitrogen)</label>
                 <value>77K</value>
-                <label>77K (liquid nitrogen)</label>
             </preset>
             <preset>
+                <label>4.2K (liquid helium)</label>
                 <value>4.2K</value>
-                <label>4.2K (liquid helium)</label>
             </preset>
         </number>
Index: trunk/examples/objects/number/Makefile.in
===================================================================
--- trunk/examples/objects/number/Makefile.in	(revision 1569)
+++ trunk/examples/objects/number/Makefile.in	(revision 1581)
@@ -34,5 +34,4 @@
 FILES   = \
 		$(srcdir)/number.cc \
-		$(srcdir)/number_1_0_in.xml \
 		Makefile
 
Index: trunk/examples/objects/number/number.cc
===================================================================
--- trunk/examples/objects/number/number.cc	(revision 1569)
+++ trunk/examples/objects/number/number.cc	(revision 1581)
@@ -1,10 +1,5 @@
 #include <iostream>
-#include <errno.h>
-#include <fstream>
-#include <sys/stat.h>
 #include "RpNumber.h"
-
-size_t indent = 0;
-size_t tabstop = 4;
+#include "RpTest.h"
 
 int
@@ -24,84 +19,4 @@
 }
 
-int testStringVal(
-    const char *testname,
-    const char *desc,
-    const char *expected,
-    const char *received)
-{
-    if ((!expected && received) ||
-        (expected && !received) ||
-        (expected && received && strcmp(expected,received) != 0)) {
-        printf("Error: %s\n", testname);
-        printf("\t%s\n", desc);
-        printf("\texpected \"%s\"\n",expected);
-        printf("\treceived \"%s\"\n",received);
-        return 1;
-    }
-    return 0;
-}
-
-int testDoubleVal(
-    const char *testname,
-    const char *desc,
-    double expected,
-    double received)
-{
-    if (expected != received) {
-        printf("Error: %s\n", testname);
-        printf("\t%s\n", desc);
-        printf("\texpected \"%g\"\n",expected);
-        printf("\treceived \"%g\"\n",received);
-        return 1;
-    }
-    return 0;
-}
-
-size_t
-readFile (
-    const char *filePath,
-    const char **buf)
-{
-    if (buf == NULL) {
-        fprintf(stderr,"buf is NULL while opening file \"%s\"", filePath);
-        return 0;
-    }
-
-    FILE *f;
-    f = fopen(filePath, "rb");
-    if (f == NULL) {
-        fprintf(stderr,"can't open \"%s\": %s", filePath, strerror(errno));
-        return 0;
-    }
-    struct stat stat;
-    if (fstat(fileno(f), &stat) < 0) {
-        fprintf(stderr,"can't stat \"%s\": %s", filePath, strerror(errno));
-        return 0;
-    }
-    off_t size;
-    size = stat.st_size;
-    char* memblock;
-    memblock = new char [size+1];
-    if (memblock == NULL) {
-        fprintf(stderr,"can't allocate %zu bytes for file \"%s\": %s",
-            (size_t)size, filePath, strerror(errno));
-        fclose(f);
-        return 0;
-    }
-
-    size_t nRead;
-    nRead = fread(memblock, sizeof(char), size, f);
-    fclose(f);
-
-    if (nRead != (size_t)size) {
-        fprintf(stderr,"can't read %zu bytes from \"%s\": %s",
-            (size_t) size, filePath, strerror(errno));
-        return 0;
-    }
-
-    memblock[size] = '\0';
-    *buf = memblock;
-    return nRead;
-}
 int number_0_0 ()
 {
@@ -180,16 +95,377 @@
     const char *testdesc = "test constructing number from xml";
     const char *testname = "number_1_0";
-    const char *filePath = "number_1_0_in.xml";
-    int retVal = 0;
-
-    const char *buf = NULL;
-    readFile(filePath,&buf);
-
-    const char *name = "Ef";
-    const char *units = "eV";
-    double def = 0;
-    double cur = 5;
-    double min = -10;
-    double max = 10;
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+    <preset>\
+        <value>300K</value>\
+        <label>300K (room temperature)</label>\
+    </preset>\
+    <preset>\
+        <value>77K</value>\
+        <label>77K (liquid nitrogen)</label>\
+    </preset>\
+    <preset>\
+        <value>4.2K</value>\
+        <label>4.2K (liquid helium)</label>\
+    </preset>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_1 ()
+{
+    const char *testdesc = "test constructing number from xml, no min";
+    const char *testname = "number_1_1";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_2 ()
+{
+    const char *testdesc = "test constructing number from xml, no max";
+    const char *testname = "number_1_2";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_3 ()
+{
+    const char *testdesc = "test constructing number from xml, no min, no max";
+    const char *testname = "number_1_3";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_4 ()
+{
+    const char *testdesc = "test constructing number from xml, no cur";
+    const char *testname = "number_1_4";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 0;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    // if no current value is provided it defaults to 0.0.
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_5 ()
+{
+    const char *testdesc = "test constructing number from xml, no def";
+    const char *testname = "number_1_5";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <current>5eV</current>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    // if no default value is provided it defaults to 0.0.
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_6 ()
+{
+    const char *testdesc = "test constructing number from xml, no def, no cur";
+    const char *testname = "number_1_6";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 0;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_7 ()
+{
+    const char *testdesc = "test constructing number from xml, no def cur min max";
+    const char *testname = "number_1_7";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 0;
+    double min = 0;
+    double max = 0;
     const char *label = "Fermi Level";
     const char *desc = "Energy at center of distribution.";
@@ -210,4 +486,413 @@
     return retVal;
 }
+
+int number_1_8 ()
+{
+    const char *testdesc = "test constructing number from xml, no explicit units";
+    const char *testname = "number_1_8";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    // units are implied from min, max, def, cur values
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_9 ()
+{
+    const char *testdesc = "test constructing number from xml, no description";
+    const char *testname = "number_1_9";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_10 ()
+{
+    const char *testdesc = "test constructing number from xml, no label";
+    const char *testname = "number_1_10";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_11 ()
+{
+    const char *testdesc = "test constructing number from xml, no label description";
+    const char *testname = "number_1_11";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+    </about>\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "";
+    const char *desc = "";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    // if no default value and no current value is provided
+    // both default to 0.0.
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_12 ()
+{
+    const char *testdesc = "test constructing number from xml, no about label description";
+    const char *testname = "number_1_12";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <units>eV</units>\
+    <min>-10eV</min>\
+    <max>10eV</max>\
+    <default>0eV</default>\
+    <current>5eV</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = "eV";
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "";
+    const char *desc = "";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    // if no default value and no current value is provided
+    // both default to 0.0.
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_13 ()
+{
+    const char *testdesc = "test constructing number from xml, no def cur min max units";
+    const char *testname = "number_1_13";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = NULL;
+    double def = 0;
+    double cur = 0;
+    double min = 0;
+    double max = 0;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    // if no default value and no current value is provided
+    // both default to 0.0.
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_14 ()
+{
+    const char *testdesc = "test constructing number from xml, only name";
+    const char *testname = "number_1_14";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+</number>";
+
+
+    const char *name = "Ef";
+    const char *units = NULL;
+    double def = 0;
+    double cur = 0;
+    double min = 0;
+    double max = 0;
+    const char *label = "";
+    const char *desc = "";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_15 ()
+{
+    const char *testdesc = "test constructing number from xml, no info";
+    const char *testname = "number_1_15";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number>\
+</number>";
+
+
+    const char *name = "";
+    const char *units = NULL;
+    double def = 0;
+    double cur = 0;
+    double min = 0;
+    double max = 0;
+    const char *label = "";
+    const char *desc = "";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+int number_1_16 ()
+{
+    const char *testdesc = "test constructing number from xml, no explicit or implied units";
+    const char *testname = "number_1_16";
+    int retVal = 0;
+
+    const char *buf =
+"<?xml version=\"1.0\"?>\
+<number id=\"Ef\">\
+    <about>\
+        <label>Fermi Level</label>\
+        <description>Energy at center of distribution.</description>\
+    </about>\
+    <min>-10</min>\
+    <max>10</max>\
+    <default>0</default>\
+    <current>5</current>\
+</number>";
+
+    const char *name = "Ef";
+    const char *units = NULL;
+    double def = 0;
+    double cur = 5;
+    double min = -10;
+    double max = 10;
+    const char *label = "Fermi Level";
+    const char *desc = "Energy at center of distribution.";
+
+    Rappture::Number n;
+
+    n.configure(Rappture::RPCONFIG_XML,(void*)buf);
+
+    retVal |= testStringVal(testname,testdesc,name,n.name());
+    retVal |= testStringVal(testname,testdesc,units,n.units());
+    retVal |= testDoubleVal(testname,testdesc,def,n.def());
+    retVal |= testDoubleVal(testname,testdesc,cur,n.cur());
+    if (n.minset()) {
+        retVal |= testDoubleVal(testname,testdesc,min,n.min());
+    }
+    if (n.maxset()) {
+        retVal |= testDoubleVal(testname,testdesc,max,n.max());
+    }
+    retVal |= testStringVal(testname,testdesc,label,n.label());
+    retVal |= testStringVal(testname,testdesc,desc,n.desc());
+
+    return retVal;
+}
+
+// FIXME: more tests:
+// what if units in min, max, def, cur differ from units()
+// what if you can't convert from units in min, max, def, cur to units()
+// what if units in presets differ from units()
+// test case for value() function when only cur was configured
+// test case for value() function when only def was configured
+// test case for vvalue() function with no hints
+// test case for vvalue() function with "units=" hint
+// test case for setting up object, what is cur when only def is provided
+// test case for setting up object, what is def when only cur is provided
 
 int main()
@@ -216,4 +901,20 @@
     number_0_1();
     number_1_0();
+    number_1_1();
+    number_1_2();
+    number_1_3();
+    number_1_4();
+    number_1_5();
+    number_1_6();
+    number_1_7();
+    number_1_8();
+    number_1_9();
+    number_1_10();
+    number_1_11();
+    number_1_12();
+    number_1_13();
+    number_1_14();
+    number_1_15();
+    number_1_16();
 
     return 0;
Index: trunk/examples/objects/path/path.cc
===================================================================
--- trunk/examples/objects/path/path.cc	(revision 1569)
+++ trunk/examples/objects/path/path.cc	(revision 1581)
@@ -782,4 +782,5 @@
 //        input.number2(eee)
 //        input.number(eee)2
+// FIXME: add test for _ifs inside of id tags
 
 int main()
Index: trunk/examples/objects/plot/plot.cc
===================================================================
--- trunk/examples/objects/plot/plot.cc	(revision 1569)
+++ trunk/examples/objects/plot/plot.cc	(revision 1581)
@@ -154,8 +154,9 @@
     std::printf("curveCnt = %zu\n",curveCnt);
 
-    size_t indent = 0;
-    size_t tabstop = 4;
-
-    std::printf("xml: %s\n",p1->xml(indent,tabstop));
+    Rappture::ClientDataXml d;
+    d.indent = 0;
+    d.tabstop = 4;
+    p1->dump(Rappture::RPCONFIG_XML,&d);
+    std::printf("xml: %s\n",d.retStr);
 
     delete p1;
Index: trunk/examples/objects/xmlparser/Makefile.in
===================================================================
--- trunk/examples/objects/xmlparser/Makefile.in	(revision 1569)
+++ trunk/examples/objects/xmlparser/Makefile.in	(revision 1581)
@@ -35,5 +35,7 @@
 		$(srcdir)/xmlparser.cc \
 		$(srcdir)/xmlparser_1_0_in.xml \
+		$(srcdir)/xmlparser_1_1_in.xml \
 		$(srcdir)/xmlparser_1_0_out.xml \
+		$(srcdir)/xmlparser_1_1_out.xml \
 		$(srcdir)/xmlparser_2_0_in.xml \
 		$(srcdir)/xmlparser_5_0_in.xml \
Index: trunk/examples/objects/xmlparser/xmlparser.cc
===================================================================
--- trunk/examples/objects/xmlparser/xmlparser.cc	(revision 1569)
+++ trunk/examples/objects/xmlparser/xmlparser.cc	(revision 1581)
@@ -32,5 +32,5 @@
     if (memblock == NULL) {
         fprintf(stderr,"can't allocate %zu bytes for file \"%s\": %s",
-            size, filePath, strerror(errno));
+            (size_t) size, filePath, strerror(errno));
         fclose(f);
         return 0;
@@ -42,5 +42,5 @@
 
     if (nRead != (size_t)size) {
-        fprintf(stderr,"can't read %zu bytes from \"%s\": %s", size, filePath,
+        fprintf(stderr,"can't read %zu bytes from \"%s\": %s", (size_t) size, filePath,
             strerror(errno));
         return 0;
@@ -86,4 +86,45 @@
     const char *infile = "xmlparser_1_0_in.xml";
     const char *outfile = "xmlparser_1_0_out.xml";
+    int retVal = 0;
+
+    const char *xmltext = NULL;
+    const char *expected = NULL;
+
+    readFile(infile,&xmltext);
+    readFile(outfile,&expected);
+
+    const char *received = NULL;
+
+    Rp_ParserXml *p = NULL;
+
+    p = Rp_ParserXmlCreate();
+
+    Rp_ParserXmlParse(p, xmltext);
+
+    received = Rp_ParserXmlXml(p);
+
+
+    if (strcmp(expected,received) != 0) {
+        printf("Error: %s\n", testname);
+        printf("\t%s\n", desc);
+        printf("\texpected %zu bytes: \"%s\"\n",strlen(expected), expected);
+        printf("\treceived %zu bytes: \"%s\"\n",strlen(received), received);
+        retVal = 1;
+    }
+
+    if (p) {
+        Rp_ParserXmlDestroy(&p);
+    }
+
+    return retVal;
+}
+
+
+int xmlparser_1_1 ()
+{
+    const char *desc = "test sending xml text to xml parser";
+    const char *testname = "xmlparser_1_1";
+    const char *infile = "xmlparser_1_1_in.xml";
+    const char *outfile = "xmlparser_1_1_out.xml";
     int retVal = 0;
 
@@ -313,4 +354,5 @@
     xmlparser_0_0();
     xmlparser_1_0();
+    xmlparser_1_1();
     xmlparser_2_0();
     xmlparser_3_0();
Index: trunk/examples/objects/xmlparser/xmlparser_1_1_in.xml
===================================================================
--- trunk/examples/objects/xmlparser/xmlparser_1_1_in.xml	(revision 1581)
+++ trunk/examples/objects/xmlparser/xmlparser_1_1_in.xml	(revision 1581)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<run>
+    <tool>
+        <about>Press Simulate to view results.</about>
+        <command>tclsh @tool/fermi.tcl @driver</command>
+    </tool>
+    <input>
+        <number id="Ef">
+            <about>
+                <label>Fermi Level</label>
+                <description>Energy at center of distribution.</description>
+            </about>
+            <units>eV</units>
+            <min>-10eV</min>
+            <max>10eV</max>
+            <default>0eV</default>
+            <current>  0eV   </current>
+        </number>
+        <number id="voltage">
+            <about>
+                <label>voltage</label>
+                <description>give a voltage.</description>
+            </about>
+            <units>V</units>
+            <min>-1V</min>
+            <max>1V</max>
+            <default>0V</default>
+            <current>0V</current>
+        </number>
+    </input>
+</run>
Index: trunk/examples/objects/xmlparser/xmlparser_1_1_out.xml
===================================================================
--- trunk/examples/objects/xmlparser/xmlparser_1_1_out.xml	(revision 1581)
+++ trunk/examples/objects/xmlparser/xmlparser_1_1_out.xml	(revision 1581)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<run>
+    <tool>
+        <about>Press Simulate to view results.</about>
+        <command>tclsh @tool/fermi.tcl @driver</command>
+    </tool>
+    <input>
+        <number id="Ef">
+            <about>
+                <label>Fermi Level</label>
+                <description>Energy at center of distribution.</description>
+            </about>
+            <units>eV</units>
+            <min>-10eV</min>
+            <max>10eV</max>
+            <default>0eV</default>
+            <current>0eV</current>
+        </number>
+        <number id="voltage">
+            <about>
+                <label>voltage</label>
+                <description>give a voltage.</description>
+            </about>
+            <units>V</units>
+            <min>-1V</min>
+            <max>1V</max>
+            <default>0V</default>
+            <current>0V</current>
+        </number>
+    </input>
+</run>
