docs: def params(self):
          """
          Returns a list where each element is a nicely formatted
          parameter of this function. This includes argument lists,
          keyword arguments and default values.
          """
          def fmt_param(el):
              if isinstance(el, str) or isinstance(el, unicode):
                  return el
              else:
                  return '(%s)' % (', '.join(map(fmt_param, el)))
          try:
              getspec = getattr(inspect, 'getfullargspec', inspect.getargspec)
              s = getspec(self.func)
          except TypeError:
              # I guess this is for C builtin functions?
              return ['...']
  
          params = []
          for i, param in enumerate(s.args):
              if param.lower() == 'self':
                  continue
              if s.defaults is not None and len(s.args) - i <= len(s.defaults):
                  defind = len(s.defaults) - (len(s.args) - i)
                  default_value = s.defaults[defind]
                  value = repr(default_value).strip()
                  if value[0] == '<' and value[-1] == '>':
                      if type(default_value) == types.TypeType:
                          value = default_value.__name__
                      elif type(default_value) == types.ObjectType:
                          value = '%s()'%(default_value.__class__.__name__)
                  params.append('%s=%s' % (param, value))
              else:
                  params.append(fmt_param(param))
          if s.varargs is not None:
              params.append('*%s' % s.varargs)
  
          # TODO: This needs to be adjusted in Python 3. There's more stuff
          #       returned from getfullargspec than what we're looking at here.
          keywords = getattr(s, 'varkw', getattr(s, 'keywords', None))
          if keywords is not None:
              params.append('**%s' % keywords)
          return params