type checking complete, I don't love it.... but it works