using some static newinstance methods to tidy up the construction of these big objects urghh