getting too complicated, break into separate classes