interfaces should be used here instead of implementations