this should be an abstract method instead