using abc, better defines the interface to implement