function AutoPlace(eventBus, modeling, canvas) {

  eventBus.on('autoPlace', LOW_PRIORITY, function(context) {
    var shape = context.shape,
        source = context.source;

    return getNewShapePosition(source, shape);
  });

  eventBus.on('autoPlace.end', function(event) {
    canvas.scrollToElement(event.shape);
  });

  /**
   * Append shape to source at appropriate position.
   *
   * @param {Shape} source
   * @param {Shape} shape
   * @param {any} [hints={}]
   *
   * @return {Shape} appended shape
   */
  this.append = function(source, shape, hints) {

    eventBus.fire('autoPlace.start', {
      source: source,
      shape: shape
    });

    // allow others to provide the position
    var position = eventBus.fire('autoPlace', {
      source: source,
      shape: shape
    });

    var newShape = modeling.appendShape(source, shape, position, source.parent, hints);

    eventBus.fire('autoPlace.end', {
      source: source,
      shape: newShape
    });

    return newShape;
  };

}
A service that places elements connected to existing ones
to an appropriate position in an _automated_ fashion.

@param {EventBus} eventBus
@param {Modeling} modeling
@param {Canvas} canvas