refactored to add caching