/**
 * generated by Xtext 2.11.0.beta2
 */
package org.eclipse.osbp.xtext.oxtype.oxtype.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.osbp.xtext.oxtype.oxtype.OXImportDeclaration;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypeFactory;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;

import org.eclipse.xtext.common.types.TypesPackage;

import org.eclipse.xtext.xtype.XtypePackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class OXtypePackageImpl extends EPackageImpl implements OXtypePackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass oxImportDeclarationEClass = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private OXtypePackageImpl() {
		super(eNS_URI, OXtypeFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link OXtypePackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static OXtypePackage init() {
		if (isInited) return (OXtypePackage)EPackage.Registry.INSTANCE.getEPackage(OXtypePackage.eNS_URI);

		// Obtain or create and register package
		OXtypePackageImpl theOXtypePackage = (OXtypePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof OXtypePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new OXtypePackageImpl());

		isInited = true;

		// Initialize simple dependencies
		XtypePackage.eINSTANCE.eClass();
		TypesPackage.eINSTANCE.eClass();

		// Create package meta-data objects
		theOXtypePackage.createPackageContents();

		// Initialize created meta-data
		theOXtypePackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theOXtypePackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(OXtypePackage.eNS_URI, theOXtypePackage);
		return theOXtypePackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getOXImportDeclaration() {
		return oxImportDeclarationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getOXImportDeclaration_FqnImport() {
		return (EAttribute)oxImportDeclarationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getOXImportDeclaration_ImportedFullyQualifiedName() {
		return (EAttribute)oxImportDeclarationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OXtypeFactory getOXtypeFactory() {
		return (OXtypeFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		oxImportDeclarationEClass = createEClass(OX_IMPORT_DECLARATION);
		createEAttribute(oxImportDeclarationEClass, OX_IMPORT_DECLARATION__FQN_IMPORT);
		createEAttribute(oxImportDeclarationEClass, OX_IMPORT_DECLARATION__IMPORTED_FULLY_QUALIFIED_NAME);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		oxImportDeclarationEClass.getESuperTypes().add(theXtypePackage.getXImportDeclaration());

		// Initialize classes and features; add operations and parameters
		initEClass(oxImportDeclarationEClass, OXImportDeclaration.class, "OXImportDeclaration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getOXImportDeclaration_FqnImport(), ecorePackage.getEBoolean(), "fqnImport", null, 0, 1, OXImportDeclaration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getOXImportDeclaration_ImportedFullyQualifiedName(), ecorePackage.getEString(), "importedFullyQualifiedName", null, 0, 1, OXImportDeclaration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Create resource
		createResource(eNS_URI);
	}

} //OXtypePackageImpl
