protocol as a separate class