make protocol into abstract class