834194a10ad846f3fd0bb2bc1eea5b0b5c029cd7
angie
  Wed Nov 18 23:38:39 2015 -0800
Interface change: removing setAutoSqlObject method from streamer and
exposing annoGratorSetAutoSqlObject because asObj should never be
externally imposed, but a streamer/grator may have a need to bootstrap
itself without an asObj and then install one.
refs #15544

diff --git src/lib/annoStreamer.c src/lib/annoStreamer.c
index b037c64..d204917 100644
--- src/lib/annoStreamer.c
+++ src/lib/annoStreamer.c
@@ -65,44 +65,45 @@
 void annoStreamerSetFilters(struct annoStreamer *self, struct annoFilter *newFilters)
 /* Replace any existing filters with newFilters.  It is up to calling code to
  * free old filters and allocate newFilters. */
 {
 self->filters = newFilters;
 }
 
 void annoStreamerAddFilters(struct annoStreamer *self, struct annoFilter *newFilters)
 /* Add newFilter(s).  It is up to calling code to allocate newFilters. */
 {
 self->filters = slCat(newFilters, self->filters);
 }
 
 void annoStreamerInit(struct annoStreamer *self, struct annoAssembly *assembly,
 		      struct asObject *asObj, char *name)
-/* Initialize a newly allocated annoStreamer with default annoStreamer methods and
- * default filters and columns based on asObj.
+/* Initialize a newly allocated annoStreamer with default annoStreamer methods.
+ * If asObj is NULL, then the caller must call annoStreamerSetAutoSqlObject before
+ * configuring filters.
  * In general, subclasses' constructors will call this first; override nextRow, close,
  * and probably setRegion; and then initialize their private data. */
 {
 self->assembly = assembly;
 self->getAutoSqlObject = annoStreamerGetAutoSqlObject;
-self->setAutoSqlObject = annoStreamerSetAutoSqlObject;
 self->setRegion = annoStreamerSetRegion;
 self->getHeader = annoStreamerGetHeader;
 self->setFilters = annoStreamerSetFilters;
 self->addFilters = annoStreamerAddFilters;
 self->positionIsGenome = TRUE;
-self->setAutoSqlObject(self, asObj);
+if (asObj != NULL)
+    annoStreamerSetAutoSqlObject(self, asObj);
 if (name == NULL)
     errAbort("annoStreamerInit: need non-NULL name");
 self->name = cloneString(name);
 }
 
 void annoStreamerFree(struct annoStreamer **pSelf)
 /* Free self. This should be called at the end of subclass close methods, after
  * subclass-specific connections are closed and resources are freed. */
 {
 if (pSelf == NULL)
     return;
 struct annoStreamer *self = *pSelf;
 freez(&(self->name));
 freez(&(self->chrom));
 freez(pSelf);