use interface instead of implementation