Index: /trunk/glueforge/templates/psdb/Makefile.am
===================================================================
--- /trunk/glueforge/templates/psdb/Makefile.am	(revision 8153)
+++ /trunk/glueforge/templates/psdb/Makefile.am	(revision 8154)
@@ -68,4 +68,6 @@
     popobject_c.tt \
     popobject_h.tt \
+	printobjects.tt \
+	printobjects_h.tt \
     selectrowobjects.tt \
     selectrowobjects_h.tt \
Index: /trunk/glueforge/templates/psdb/code.tt
===================================================================
--- /trunk/glueforge/templates/psdb/code.tt	(revision 8153)
+++ /trunk/glueforge/templates/psdb/code.tt	(revision 8154)
@@ -1,2 +1,4 @@
+#include <stdio.h>
+
 #include "[% pkg_name %].h"
 
@@ -25,3 +27,4 @@
 [% INCLUDE selectrowobjects.tt -%]
 [% INCLUDE deleterowobjects.tt -%]
+[% INCLUDE printobjects.tt -%]
 [% END -%]
Index: /trunk/glueforge/templates/psdb/header.tt
===================================================================
--- /trunk/glueforge/templates/psdb/header.tt	(revision 8153)
+++ /trunk/glueforge/templates/psdb/header.tt	(revision 8154)
@@ -30,4 +30,5 @@
 [% INCLUDE selectrowobjects_h.tt -%]
 [% INCLUDE deleterowobjects_h.tt -%]
+[% INCLUDE printobjects_h.tt -%]
 [% END -%]
 
Index: /trunk/glueforge/templates/psdb/printobjects.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printobjects.tt	(revision 8154)
+++ /trunk/glueforge/templates/psdb/printobjects.tt	(revision 8154)
@@ -0,0 +1,34 @@
+bool [% table.namespace %]PrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = [% table.namespace %]MetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            [% table.namespace FILTER upper %]_TABLE_NAME,
+            PS_META_DUPLICATE_OK,
+            NULL,
+            md
+        )) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
+            psFree(md);
+            psFree(output);
+            return false;
+        }
+        psFree(md);
+    }
+
+    psString str = psMetadataConfigFormat(output);
+    if (!str) {
+        psError(PS_ERR_UNKNOWN, false, "failed to format data into a string");
+        psFree(output);
+    }
+    psFree(output);
+    fprintf(stream, "%s\n", str);
+    psFree(str);
+
+    return true;
+}
Index: /trunk/glueforge/templates/psdb/printobjects_h.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printobjects_h.tt	(revision 8154)
+++ /trunk/glueforge/templates/psdb/printobjects_h.tt	(revision 8154)
@@ -0,0 +1,10 @@
+/** Formats and prints an array of [% table.object_name %] objects
+ *
+ * @return A boolean - false on error
+ */
+
+bool [% table.namespace %]PrintObjects(
+    FILE            *stream,            ///< a stream
+    psArray         *objects,           ///< An array of [% table.object_name %] objects
+    bool            mdconfigformat      ///< format as mdconfig or simple
+);
