I think this method should memoize, too.  I can think of situations where calling the predicate will cause the method on the object to be executed but still raise a `NameError` (e.g. due to the implementation delegating to some other object and triggering a `NameError`), and in such situations the predicate could be executed twice.