docs: def generateImplicitParameters(cls, obj):
          """
          Create PRODID, VERSION, and VTIMEZONEs if needed.
  
          VTIMEZONEs will need to exist whenever TZID parameters exist or when
          datetimes with tzinfo exist.
          """
          for comp in obj.components():
              if comp.behavior is not None:
                  comp.behavior.generateImplicitParameters(comp)
          if not hasattr(obj, 'prodid'):
              obj.add(ContentLine('PRODID', [], PRODID))
          if not hasattr(obj, 'version'):
              obj.add(ContentLine('VERSION', [], cls.versionString))
          tzidsUsed = {}
  
          def findTzids(obj, table):
              if isinstance(obj, ContentLine) and (obj.behavior is None or
                                                   not obj.behavior.forceUTC):
                  if getattr(obj, 'tzid_param', None):
                      table[obj.tzid_param] = 1
                  else:
                      if type(obj.value) == list:
                          for item in obj.value:
                              tzinfo = getattr(obj.value, 'tzinfo', None)
                              tzid = TimezoneComponent.registerTzinfo(tzinfo)
                              if tzid:
                                  table[tzid] = 1
                      else:
                          tzinfo = getattr(obj.value, 'tzinfo', None)
                          tzid = TimezoneComponent.registerTzinfo(tzinfo)
                          if tzid:
                              table[tzid] = 1
              for child in obj.getChildren():
                  if obj.name != 'VTIMEZONE':
                      findTzids(child, table)
  
          findTzids(obj, tzidsUsed)
          oldtzids = [toUnicode(x.tzid.value) for x in getattr(obj, 'vtimezone_list', [])]
          for tzid in tzidsUsed.keys():
              tzid = toUnicode(tzid)
              if tzid != u'UTC' and tzid not in oldtzids:
                  obj.add(TimezoneComponent(tzinfo=getTzid(tzid)))