I've been working on this in my spare time for a while now, might as well put it under source control.