split engine up into macro objects