DM-17982, it is possible to attach almost any object to an Exposure and round-trip it through FITS, without the need for explicit support within the Exposure or ExposureInfo classes. This is handled through the *Component methods on ExposureInfo (these methods were not added to Exposure itself mostly because they make for a very clunky API in C++).
While working on
DM-27169, I noticed that generic components are not supported by obs.base.FitsExposureFormatter and obs.base.ExposureAssembler – the former returns nonstandard objects only as an "extras" blob, and the latter ignores them entirely. This arrangement also closely couples obs_base code to several afw classes, including the builder API of afw.image.ExposureFitsReader.
I propose that obs_base instead access all components other than image planes through generic methods on ExposureInfo and ExposureFitsReader (the latter don't yet exist, though after
DM-27169 they will be easy to add). This should somewhat simplify obs_base code and make it easier to round-trip generic components through the butler.
The main problem is that there would still need to be a mapping between Butler component names and Exposure component names; the former are constrained by user-friendliness, the latter by compatibility with the FITS format and old Exposure files. I'm not sure how to resolve that in a way that is more flexible than the current system.