@classmethod<EOL><INDENT>def _find_methods(cls, *names, **kwds):<DEDENT>
reverse = kwds.pop('<STR_LIT>', False)<EOL>assert not kwds, repr(kwds)<EOL>cache = cls.__dict__.get('<STR_LIT>')<EOL>if cache:<EOL><INDENT>hit = cache.get(names)<EOL>if hit is not None:<EOL><INDENT>return hit<EOL><DEDENT><DEDENT>else:<EOL><INDENT>cls._find_methods_cache = cache = {}<EOL><DEDENT>methods = []<EOL>for c in cls.__mro__:<EOL><INDENT>for name in names:<EOL><INDENT>method = c.__dict__.get(name)<EOL>if method is not None:<EOL><INDENT>methods.append(method)<EOL><DEDENT><DEDENT><DEDENT>if reverse:<EOL><INDENT>methods.reverse()<EOL><DEDENT>cache[names] = methods<EOL>return methods<EOL>
Compute a list of composable methods.

        Because this is a common operation and the class hierarchy is
        static, the outcome is cached (assuming that for a particular list
        of names the reversed flag is either always on, or always off).

        Args:
          *names: One or more method names.
          reverse: Optional flag, default False; if True, the list is
            reversed.

        Returns:
          A list of callable class method objects.