DO NOT USE THIS YET It works, but it's ugly - written in a hurry, in ES6, hurriedly ported to ES5. I'll clean this up over the coming weeks.