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