I'm not 100% sure I understand the requirements, but it could just be due to poor naming.
My first spin would simply remove the need for callers to understand implementation details, e.g.,
mover = Exit.remove_only_after(3)
Internally, Exit
would construct an instance using a symbol or whatever that could be checked in the scan
method. This way you only need to know the behavior you want, instead of a method name, a symbol, or whatever, that actually implements that behavior.
Depending on actual needs, I might refactor it internal to Exit
and use some form of strategy pattern, but it might be overkill. It really depends on how different the behaviors are, and how complex they are.