Injectable DOM properties

#140 was reported today which was something I was interested in fixing anyway. Turns out this is pretty easy.

I think this internal refactoring is basically pure win. If you guys don't want to expose the API publicly yet to keep the surface area of the API small I can revert the second commit on this.