refactored interface into abstract class, some documentation