def __init__(self, docstring=None, what='', name='',
                 obj=None, options=None):

        if not what:
            if inspect.isclass(obj):
                what = 'class'
            elif inspect.ismodule(obj):
                what = 'module'
            elif isinstance(obj, collections.Callable):  # type: ignore
                what = 'function'
            else:
                what = 'object'

        if docstring is None:
            if obj is None:
                raise "If docstring is None, obj may not be"
            docstring = obj.__doc__

        self._what = what
        self._name = name
        self._obj = obj
        if isinstance(docstring, str):
            docstring = _prepare_docstring(docstring)
        self._lines = docstring
        self._line_iter = modify_iter(docstring, modifier=lambda s: s.rstrip())
        self._parsed_lines = []  # type: List[unicode]
        self._is_in_section = False
        self._section_indent = 0
        self._directive_sections = []  # type: List[unicode]
        self._entry_sections = {
            'args': self._parse_fields_section,
            'attributes': self._parse_fields_section,
            'returns': self._parse_fields_section,
            'yields': self._parse_fields_section,
            'example args': self._parse_fields_section,
        }  # type: Dict[unicode, Callable]

        self._freeform_sections = {
            'example': self._parse_generic_section,
            'examples': self._parse_generic_section,
            'example returns': self._parse_generic_section,
            'note': self._parse_generic_section,
            'references': self._parse_generic_section,
            'see also': self._parse_generic_section,
            'todo': self._parse_generic_section,
        }  # type: Dict[unicode, Callable]

        self._sections = {
            name: value
            for name, value in [*self._entry_sections.items(), *self._freeform_sections.items()]
        }

        self._parsed_dicts = {
            name: []
            for name in self._entry_sections.keys()
        }
        self._parse()