optimize: cache candidates and use it in clone()