separate interface from its implementation