docs: def guess_headers(self):
          """
          Attempt to guess what headers may be required in order to use this
          type. Returns `guess_headers` of all children recursively.
  
          * If the typename is in the :const:`KNOWN_TYPES` dictionary, use the
              header specified there
          * If it's an STL type, include <{type}>
          * If it exists in the ROOT namespace and begins with T,
            include <{type}.h>
          """
          name = self.name.replace("*", "")
          headers = []
          if name in KNOWN_TYPES:
              headers.append(KNOWN_TYPES[name])
          elif name in STL:
              headers.append('<{0}>'.format(name))
          elif hasattr(ROOT, name) and name.startswith("T"):
              headers.append('<{0}.h>'.format(name))
          elif '::' in name:
              headers.append('<{0}.h>'.format(name.replace('::', '/')))
          elif name == 'allocator':
              headers.append('<memory>')
          else:
              try:
                  # is this just a basic type?
                  CPPGrammar.BASIC_TYPE.parseString(name, parseAll=True)
              except ParseException as e:
                  # nope... I don't know what it is
                  log.warning(
                      "unable to guess headers required for {0}".format(name))
          if self.params:
              for child in self.params:
                  headers.extend(child.guess_headers)
          # remove duplicates
          return list(set(headers))