refactor to use NSCache()