

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
  <%if (genModel.useClassOverrideAnnotation()) {%>
	@Override
  <%}%>
	public void eUnset(int featureID)
	{
		switch (featureID<%=negativeOffsetCorrection%>)
		{
  <%for (GenFeature genFeature : genClass.getEUnsetGenFeatures()) {%>
			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
      <%if (genFeature.isWrappedFeatureMapType()) {%>
				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().clear();
      <%} else {%>
				<%=genFeature.getGetAccessor()%>().clear();
      <%}%>
    <%} else if (genFeature.isUnsettable()) {%>
				unset<%=genFeature.getAccessorName()%>();
    <%} else if (!genFeature.hasEDefault()) {%>
				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)null);
    <%} else {%>
				set<%=genFeature.getAccessorName()%>(<%=genFeature.getEDefault()%>);
    <%}%>
				return;
  <%}%>
		}
  <%if (genModel.isMinimalReflectiveMethods()) {%>
		super.eUnset(featureID);
  <%} else {%>
		eDynamicUnset(featureID);
  <%}%>
	}

