all that is left is the compile function and lots of testing :D