code: def find(self, *, name: str=None, args: str=None, returns: str=None,
               f: Callable=None) -> Iterator[Method]:
          
          for method in self._table:
              if name is not None and method.name.value != name:
                  continue
  
              descriptor = method.descriptor.value
              end_para = descriptor.find(')')
  
              m_args = descriptor[1:end_para]
              if args is not None and args != m_args:
                  continue
  
              m_returns = descriptor[end_para + 1:]
              if returns is not None and returns != m_returns:
                  continue
  
              if f is not None and not f(method):
                  continue
  
              yield method
docs: Iterates over the methods table, yielding each matching method. Calling
          without any arguments is equivalent to iterating over the table. For
          example, to get all methods that take three integers and return void::
  
              for method in cf.methods.find(args='III', returns='V'):
                  print(method.name.value)
  
          Or to get all private methods::
  
              is_private = lambda m: m.access_flags.acc_private
              for method in cf.methods.find(f=is_private):
                  print method.name.value
  
          :param name: The name of the method(s) to find.
          :param args: The arguments descriptor (ex: ``III``)
          :param returns: The returns descriptor (Ex: ``V``)
          :param f: Any callable which takes one argument (the method).