Make implemetnation classes abstract

By making the actual implementation classes abstract
we do not get the non-exhautive match problems

Still not happy with the types