function Chart(config) {
  this.internal = new ChartInternal(this);
  this.internal.loadConfig(config);

  this.internal.beforeInit(config);
  this.internal.init();
  this.internal.afterInit(config)

  // bind "this" to nested API
  ;(function bindThis(fn, target, argThis) {
    Object.keys(fn).forEach(function(key) {
      target[key] = fn[key].bind(argThis);
      if (Object.keys(fn[key]).length > 0) {
        bindThis(fn[key], target[key], argThis);
      }
    });
  })(Chart.prototype, this, this);
}
The Chart class

The methods of this class is the public APIs of the chart object.