not using enums anymore, using an interface system to keep generic