interface based implementation