use interface instead of impl