First version, an abstract class