added a cache - made it transient. Not sure if it matters, but this way there's less chance of things taking up more space by surprise