docs: def _docspec(func, module=None, qualname=None, of_class=None):
      """ For a callable, get the full spec by merging doc_parse() and argspec()
  
      :type func: Callable
      :rtype: data.FDocstring
      """
      sp = _argspec(func)
      doc = _doc_parse(getdoc(func), module=module, qualname=qualname)
  
      # Merge args
      doc_map = {a.name: a for a in doc.args}
      doc.args = [data.Argument(a, doc_map.get(a.name.lstrip('*'), None)) for a in sp]
  
      # Args shift: dump `self`
      if (six.PY2 and inspect.ismethod(func)) or \
          (six.PY3 and (inspect.isroutine(func) and of_class is not None) and (of_class is not None and not is_method_static(of_class, func.__name__))):
              doc.args = doc.args[1:]
  
      # Signature
      doc.update_signature()
  
      # Finish
      return doc