abstracted out machine specific stuff