# HoloData Refactoring Plan
## PR 1: Data Interface / Driver Split
Rename current data interfaces to data drivers.
Add interface classes for each data "kind"
- `TabularInterface`
- `GriddedInterface`
- `GeometryInterface`
- `ImageInterface`
Interface classes are constructed with a reference to a driver class of the appropriate type (e.g. `TabularInterface` with a `dataframe` driver).
Interfaces provide methods that dispatch to their driver. In this PR, they don't do any extra logic, but in later PRs logic from the calling Dataset methods will be pushed into the Interfaces.
The `Dataset.interface` property becomes a `*Interface` instance wrapping a driver class. The API should be nearly identical, except for things that check that class of the driver.
All references to `Dataset`/`Element` classes are removed from drivers. To do this, the params that the drivers accessed on these classes are made params on the Interface classes. When a Dataset/Element constructs an interface, these required properties are passed to the interface initialization code, and they are passed to the driver functions that need them
All references to ndmapping.* classes are removed.
- Update groupby to accept generic `container_type`/`group_type` arguments that Dataset can use.
- Extract needed part of ndmapping logic for grid driver's concat
Don't move any files, behavior and public APIs should be exactly identical.
## PR 2: Create top-level holodata package
Create new top-level `holodata` package.
- move drivers to `holodata.drivers`
- move `Dimension`
- move transforms
- move needed subset of `holoviews.core.util`
For files being moved, move and commit before refactoring so git follows history.
No remaining dependencies from `holodata` on `holoviews`
## PR 3: Add holodata Dataset classes
- Add copies of `LabelledData` and `Dimensioned` to`holodata` with the style/opts/pretty-printing stuff removed
- Add `TabularDataset`, `GriddedDataset`, and `GeometryDataset` classes that dispatch methods to an associated Interface.
- Push as much shared logic as possible from `hv.Dataset` into the Interface classes.
- Extract Redim accessor superclass into `holodata` that doesn't have dynamic object logic.