separate interface and implementation classes