separate impl from test
abstract class