class definition and interfaces