declare with interfaces instead of implementations