dependency injection, cache results