based off of hw 01 but reorganized into modules