code: def declareLegacyItem(typeName, schemaVersion, attributes, dummyBases=()):
      
      if (typeName, schemaVersion) in _legacyTypes:
          return _legacyTypes[typeName, schemaVersion]
      if dummyBases:
          realBases = [declareLegacyItem(*A) for A in dummyBases]
      else:
          realBases = (Item,)
      attributes = attributes.copy()
      attributes['__module__'] = 'item_dummy'
      attributes['__legacy__'] = True
      attributes['typeName'] = typeName
      attributes['schemaVersion'] = schemaVersion
      result = type(str('DummyItem<%s,%d>' % (typeName, schemaVersion)),
                    realBases,
                    attributes)
      assert result is not None, 'wtf, %r' % (type,)
      _legacyTypes[(typeName, schemaVersion)] = result
      return result
docs: Generate a dummy subclass of Item that will have the given attributes,
      and the base Item methods, but no methods of its own.  This is for use
      with upgrading.
  
      @param typeName: a string, the Axiom TypeName to have attributes for.
      @param schemaVersion: an int, the (old) version of the schema this is a proxy
      for.
      @param attributes: a dict mapping {columnName: attr instance} describing
      the schema of C{typeName} at C{schemaVersion}.
  
      @param dummyBases: a sequence of 4-tuples of (baseTypeName,
      baseSchemaVersion, baseAttributes, baseBases) representing the dummy bases
      of this legacy class.