function PlotComposer() {
    var dataSelector = DataSelector(),
        plots = [],
        plotScale = function(plot) { return plot.scale(); },
        scale,
        accessor;

    function plotComposer(g) {
      var group = dataSelector.mapper(function() {
        return plots.map(function() { return []; });
      })(g);

      group.selection.each(function(d, i) {
        plots[i](d3_select(this));
      });

      plotComposer.refresh(g);
    }

    plotComposer.refresh = function(g) {
      dataSelector.select(g).data(function(d) {
          var value = accessor(d);
          if(value === null || value === undefined) return plots.map(function() { return []; });
          var y = scale(value);
          return plots.map(function(plot) {
            var annotationValue = plotScale(plot) === scale ? value : plotScale(plot).invert(y);
            return [ { value: annotationValue} ];
          });
        }).each(function(d, i) {
          plots[i](d3_select(this));
        });
    };

    plotComposer.plots = function(_) {
      if(!arguments.length) return plots;
      plots = _;
      return plotComposer;
    };

    /**
     * The scale of the parent
     * @param _
     * @returns {*}
     */
    plotComposer.scale = function(_) {
      if(!arguments.length) return scale;
      scale = _;
      return plotComposer;
    };

    /**
     * How do get a value from the root datum
     * @param _ A function taking d and returning a value
     * @returns {*}
     */
    plotComposer.accessor = function(_) {
      if(!arguments.length) return accessor;
      accessor = _;
      return plotComposer;
    };

    /**
     * A string id that distinguishes this composed plot from another.
     * @param _
     * @returns {*}
     */
    plotComposer.scope = function(_) {
      if(!arguments.length) return dataSelector.scope();
      dataSelector.scope(_);
      return plotComposer;
    };

    /**
     * A function to obtain the scale of the child plots
     * @param _
     * @returns {*}
     */
    plotComposer.plotScale = function(_) {
      if(!arguments.length) return plotScale;
      plotScale = _;
      return plotComposer;
    };

    return plotComposer;
  }
Helper class assists the composition of multiple techan plots. Handles:
- Automatic transfer of data down to descendants
- Automatic scaling of a value to the child ( value (parent) -> percent conversion for example)
- Plots must be of the same type, ie. Axis Annotation, Supstance)

@returns {plotComposer} An instance
@constructor