Updated to use abstract classes for protocols