all working and abstracted, ready for open source after docs