class heirarchy probably getting too complicated