rework for additional abstraction; also DDP methods don't need to be per-collection so they no longer are