docs: def _get_module_methods(module):
      '''
      Returns a methods list corresponding to the equations in the given
      module. Each entry is a dictionary with keys 'output', 'args', and
      'func' corresponding to the output, arguments, and function of the
      method. The entries may optionally include 'assumptions' and
      'overridden_by_assumptions' as keys, stating which assumptions are
      required to use the method, and which assumptions mean the method
      should not be used because it is overridden.
      '''
      # Set up the methods dict we will eventually return
      methods = []
      funcs = []
      for item in inspect.getmembers(equations):
          if (item[0][0] != '_' and '_from_' in item[0]):
              func = item[1]
              output = item[0][:item[0].find('_from_')]
          # avoid returning duplicates
          if func in funcs:
              continue
          else:
              funcs.append(func)
          args = tuple(getfullargspec(func).args)
          try:
              assumptions = tuple(func.assumptions)
          except AttributeError:
              raise NotImplementedError('function {0} in equations module has no'
                                        ' assumption '
                                        'definition'.format(func.__name__))
          try:
              overridden_by_assumptions = func.overridden_by_assumptions
          except AttributeError:
              overridden_by_assumptions = ()
          methods.append({
              'func': func,
              'args': args,
              'output': output,
              'assumptions': assumptions,
              'overridden_by_assumptions': overridden_by_assumptions,
          })
      return methods