Here's my new docstring for ChromaticObject, which hopefully clarifies what I think are the obligations of subclasses.  I also made a couple attributes private (`.A` and `.fluxFactor`) that I didn't think were really part of the public interface for the class.
```
    Base class for defining wavelength dependent objects.

    If instantiated directly, creates the simplest type of ChromaticObject of all, which is just a
    wrapper around a GSObject.  At this point, the newly created ChromaticObject will act just like
    the GSObject it wraps.  The difference is that its methods: applyExpansion, applyDilation, and
    applyShift can now accept functions of wavelength as arguments, as opposed to the constants that
    GSObjects are limited to.  These methods can be used to effect a variety of physical chromatic
    effects, such as differential chromatic refraction, chromatic seeing, and diffraction-limited
    wavelength-dependence.

    This class also serves as the base class for chromatic subclasses.  In general,
    `ChromaticObject` and subclasses should provide the following interface:
    1) Define an `evaluateAtWavelength` method, which returns a GSObject representing the
       profile at a particular wavelength.
    2) Define a `scaleFlux` method, which scales the flux at all wavelengths by a fixed multiplier.
    3) Initialize a `separable` attribute.  This marks whether (`separable = True`) or not
       (`separable = False`) the given chromatic profile can be factored into a spatial profile and
       a spectral profile.  Separable profiles can be drawn quickly by evaluating at a single
       wavelength and adjusting the flux via a (fast) 1D integral over the spectral profile.
       Inseparable profiles, on the other hand, need to be evaluated at multiple wavelengths
       in order to draw (slow).
    4) Separable objects must initialize an `SED` attribute, which is a callable object (often a
       `galsim.SED` instance) that returns the _relative_ flux of the profile at a given
       wavelength. (The _absolute_ flux is controlled by both the `SED` and the `.flux` attribute
       of the underlying chromaticized GSObject(s).  See `galsim.Chromatic` docstring.)
    5) Initialize a `wave_list` attribute, which specifies wavelengths at which the profile (or
       the SED in the case of separable profiles) will be evaluated when drawing a ChromaticObject.
       The type of `wave_list` should be a numpy array, and may be empty, in which case either the
       Bandpass object being drawn against, or the integrator being used will determine at which
       wavelengths to evaluate.

    Additionally, instances of `ChromaticObject` and subclasses will usually have either an `obj`
    attribute representing a manipulated `GSObject` or `ChromaticObject`, or an `objlist`
    attribute in the case of compound classes like `ChromaticSum` and `ChromaticConvolution`.

    @param gsobj  The GSObject to be chromaticized.
```