These are my early thoughts on how to structure DataTable in 3.5.0. Feedback is welcome in the comments.
new Y.DataTable({...});
new Y.DataTable.Base({...});
Y.DataTable.Base = Y.Base.create('datatable', Y.Widget, [Y.DataTable.Core]);
Y.DataTable = Y.mix(
    Y.Base.create('datatable', Y.DataTable.Base, []),
    Y.DataTable, true);
Class extensions CAN (if non-invasive by default)
Y.Base.mix(Y.DataTable, [ Y.DataTable.Sortable ]);
new Y.DataTable({
    data: [{ ... }, { ... }, ... ]
    data: modelList
    data: {
        source: url, function, xml
        type: 'json'
        schema: { ... }        
    }
    columns: (optional) [ key, key, { key: key, config: stuff, ... }, ... ]
    recordType: (optional) ModelClass
    headerView: (optional) ViewClass
    bodyView: (optional) ViewClass
    footerView: (optional) ViewClass
    summary: (optional) 'string'
    caption: (optional) 'string'
});
instance
    .data = modelListInstance
    .head = viewInstance
    .body = viewInstance
    .foot = viewInstance
- 
Y.DataTable.CoreEverything added to Y.Widget to make DataTable.Base 
- 
Y.DataTable.HeaderView
- 
Y.DataTable.BodyView
- 
Y.DataTable.FooterViewUsed by DataTable(.Base) to render the table contents. Referenced via configuration, not composition. 
- 
Y.DataTable.SourceOptional class extension. Adds support dataconfig to generate ML with DataSource load.
- 
Y.DataTable.ScrollableOptional class extension. Adds support for scrolling table. May be used to create a third instantiable class. 
- 
Y.DataTable.ScrollingBodyViewUsed in place of DataTable.BodyView to render the scrolling table. May not be necessary? 
- 
Y.DataTable.SortableAdds support for sorting headers and sortable config. 
instance.render(...)
- build <table> (markup only or off DOM node?)
- instantiate header, body, footer views passing
- the DT instance
- the created table?
- the dataModelList?
 
- call each view's render()
Logic for reacting to user input is moved to the View classes
Concern: string based rendering would have viewX.render() return a string or populate a property, but it has requirements of the DT renderer
instance.load(...)
Pass through to this.data.load(...). Let the ModelList be responsible for data interaction.
- No ModelList is provided in dataconfiguration AND
- No recordTypeis provided in configuration
- Use the first item in the data array to build ATTRS and Y.Base.create(...)
- If data is empty, use columns?
@lsmith sorry I was a bit vague with the dual formatters idea.
It's something I ran across, but now I think that it's out of the scope of your development (wrt calculation in footer elements).