/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz - Initial implementation
 *  
 */
package org.eclipse.osbp.xtext.functionlibrarydsl.impl;

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

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

import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;

import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionConvertToModel;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionConvertToPresentation;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryActionGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryBaseFunction;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryBlipGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryCanExecute;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryConverterGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDSLFactory;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDSLPackage;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryExecute;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryGuard;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryInitialization;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryInitializationGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryModel;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryOperation;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryPackage;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryParameter;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryRate;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryRating;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryRatingItem;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryStatemachineGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryTest;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryValidation;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryValidationGroup;

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

import org.eclipse.xtext.xbase.XbasePackage;

import org.eclipse.xtext.xtype.XtypePackage;

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryPackageEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryBlipGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryStatemachineGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryValidationGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryInitializationGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryActionGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryConverterGroupEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryRatingEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryRatingItemEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryBaseFunctionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryFunctionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryTestEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryRateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryGuardEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryOperationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryExecuteEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryCanExecuteEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryValidationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryInitializationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionConvertToModelEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionConvertToPresentationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionLibraryParameterEClass = 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.functionlibrarydsl.FunctionLibraryDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private FunctionLibraryDSLPackageImpl() {
		super(eNS_URI, FunctionLibraryDSLFactory.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 FunctionLibraryDSLPackage#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 FunctionLibraryDSLPackage init() {
		if (isInited) return (FunctionLibraryDSLPackage)EPackage.Registry.INSTANCE.getEPackage(FunctionLibraryDSLPackage.eNS_URI);

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

		isInited = true;

		// Initialize simple dependencies
		OSBPTypesPackage.eINSTANCE.eClass();

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryModel_ImportSection() {
		return (EReference)functionLibraryModelEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryModel_Pckg() {
		return (EReference)functionLibraryModelEClass.getEStructuralFeatures().get(1);
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryPackage_Ratings() {
		return (EReference)functionLibraryPackageEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryPackage_Groups() {
		return (EReference)functionLibraryPackageEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryPackage_Converters() {
		return (EReference)functionLibraryPackageEClass.getEStructuralFeatures().get(2);
	}

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Functions() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Rates() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Tests() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Guards() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Operations() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Executes() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_CanExecutes() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Validators() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(8);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_Initializators() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(9);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_ConvertToModel() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(10);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryGroup_ConvertToPresentation() {
		return (EReference)functionLibraryGroupEClass.getEStructuralFeatures().get(11);
	}

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryConverterGroup_ConvertToModelDatatype() {
		return (EReference)functionLibraryConverterGroupEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryConverterGroup_ConvertToPresentationDatatype() {
		return (EReference)functionLibraryConverterGroupEClass.getEStructuralFeatures().get(1);
	}

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryRating_Items() {
		return (EReference)functionLibraryRatingEClass.getEStructuralFeatures().get(1);
	}

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryBaseFunction_Params() {
		return (EReference)functionLibraryBaseFunctionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryBaseFunction_Body() {
		return (EReference)functionLibraryBaseFunctionEClass.getEStructuralFeatures().get(2);
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryFunction_Oftype() {
		return (EReference)functionLibraryFunctionEClass.getEStructuralFeatures().get(0);
	}

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryRate_Oftype() {
		return (EReference)functionLibraryRateEClass.getEStructuralFeatures().get(0);
	}

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFunctionLibraryParameter_ParameterType() {
		return (EReference)functionLibraryParameterEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryDSLFactory getFunctionLibraryDSLFactory() {
		return (FunctionLibraryDSLFactory)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
		functionLibraryModelEClass = createEClass(FUNCTION_LIBRARY_MODEL);
		createEReference(functionLibraryModelEClass, FUNCTION_LIBRARY_MODEL__IMPORT_SECTION);
		createEReference(functionLibraryModelEClass, FUNCTION_LIBRARY_MODEL__PCKG);

		functionLibraryPackageEClass = createEClass(FUNCTION_LIBRARY_PACKAGE);
		createEReference(functionLibraryPackageEClass, FUNCTION_LIBRARY_PACKAGE__RATINGS);
		createEReference(functionLibraryPackageEClass, FUNCTION_LIBRARY_PACKAGE__GROUPS);
		createEReference(functionLibraryPackageEClass, FUNCTION_LIBRARY_PACKAGE__CONVERTERS);

		functionLibraryGroupEClass = createEClass(FUNCTION_LIBRARY_GROUP);
		createEAttribute(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__NAME);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__FUNCTIONS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__RATES);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__TESTS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__GUARDS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__OPERATIONS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__EXECUTES);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__CAN_EXECUTES);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__VALIDATORS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__INITIALIZATORS);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL);
		createEReference(functionLibraryGroupEClass, FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION);

		functionLibraryBlipGroupEClass = createEClass(FUNCTION_LIBRARY_BLIP_GROUP);

		functionLibraryStatemachineGroupEClass = createEClass(FUNCTION_LIBRARY_STATEMACHINE_GROUP);

		functionLibraryValidationGroupEClass = createEClass(FUNCTION_LIBRARY_VALIDATION_GROUP);

		functionLibraryInitializationGroupEClass = createEClass(FUNCTION_LIBRARY_INITIALIZATION_GROUP);

		functionLibraryActionGroupEClass = createEClass(FUNCTION_LIBRARY_ACTION_GROUP);

		functionLibraryConverterGroupEClass = createEClass(FUNCTION_LIBRARY_CONVERTER_GROUP);
		createEReference(functionLibraryConverterGroupEClass, FUNCTION_LIBRARY_CONVERTER_GROUP__CONVERT_TO_MODEL_DATATYPE);
		createEReference(functionLibraryConverterGroupEClass, FUNCTION_LIBRARY_CONVERTER_GROUP__CONVERT_TO_PRESENTATION_DATATYPE);

		functionLibraryRatingEClass = createEClass(FUNCTION_LIBRARY_RATING);
		createEAttribute(functionLibraryRatingEClass, FUNCTION_LIBRARY_RATING__NAME);
		createEReference(functionLibraryRatingEClass, FUNCTION_LIBRARY_RATING__ITEMS);

		functionLibraryRatingItemEClass = createEClass(FUNCTION_LIBRARY_RATING_ITEM);
		createEAttribute(functionLibraryRatingItemEClass, FUNCTION_LIBRARY_RATING_ITEM__NAME);

		functionLibraryBaseFunctionEClass = createEClass(FUNCTION_LIBRARY_BASE_FUNCTION);
		createEAttribute(functionLibraryBaseFunctionEClass, FUNCTION_LIBRARY_BASE_FUNCTION__NAME);
		createEReference(functionLibraryBaseFunctionEClass, FUNCTION_LIBRARY_BASE_FUNCTION__PARAMS);
		createEReference(functionLibraryBaseFunctionEClass, FUNCTION_LIBRARY_BASE_FUNCTION__BODY);

		functionLibraryFunctionEClass = createEClass(FUNCTION_LIBRARY_FUNCTION);
		createEReference(functionLibraryFunctionEClass, FUNCTION_LIBRARY_FUNCTION__OFTYPE);

		functionLibraryTestEClass = createEClass(FUNCTION_LIBRARY_TEST);

		functionLibraryRateEClass = createEClass(FUNCTION_LIBRARY_RATE);
		createEReference(functionLibraryRateEClass, FUNCTION_LIBRARY_RATE__OFTYPE);

		functionLibraryGuardEClass = createEClass(FUNCTION_LIBRARY_GUARD);

		functionLibraryOperationEClass = createEClass(FUNCTION_LIBRARY_OPERATION);

		functionLibraryExecuteEClass = createEClass(FUNCTION_LIBRARY_EXECUTE);

		functionLibraryCanExecuteEClass = createEClass(FUNCTION_LIBRARY_CAN_EXECUTE);

		functionLibraryValidationEClass = createEClass(FUNCTION_LIBRARY_VALIDATION);

		functionLibraryInitializationEClass = createEClass(FUNCTION_LIBRARY_INITIALIZATION);

		functionConvertToModelEClass = createEClass(FUNCTION_CONVERT_TO_MODEL);

		functionConvertToPresentationEClass = createEClass(FUNCTION_CONVERT_TO_PRESENTATION);

		functionLibraryParameterEClass = createEClass(FUNCTION_LIBRARY_PARAMETER);
		createEAttribute(functionLibraryParameterEClass, FUNCTION_LIBRARY_PARAMETER__NAME);
		createEReference(functionLibraryParameterEClass, FUNCTION_LIBRARY_PARAMETER__PARAMETER_TYPE);
	}

	/**
	 * <!-- 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);
		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
		XbasePackage theXbasePackage = (XbasePackage)EPackage.Registry.INSTANCE.getEPackage(XbasePackage.eNS_URI);
		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		functionLibraryPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		functionLibraryBlipGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryStatemachineGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryValidationGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryInitializationGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryActionGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryConverterGroupEClass.getESuperTypes().add(this.getFunctionLibraryGroup());
		functionLibraryFunctionEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryTestEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryRateEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryGuardEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryOperationEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryExecuteEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryCanExecuteEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryValidationEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionLibraryInitializationEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionConvertToModelEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());
		functionConvertToPresentationEClass.getESuperTypes().add(this.getFunctionLibraryBaseFunction());

		// Initialize classes, features, and operations; add parameters
		initEClass(functionLibraryModelEClass, FunctionLibraryModel.class, "FunctionLibraryModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionLibraryModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, FunctionLibraryModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryModel_Pckg(), this.getFunctionLibraryPackage(), null, "pckg", null, 0, 1, FunctionLibraryModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryPackageEClass, FunctionLibraryPackage.class, "FunctionLibraryPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionLibraryPackage_Ratings(), this.getFunctionLibraryRating(), null, "ratings", null, 0, -1, FunctionLibraryPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryPackage_Groups(), this.getFunctionLibraryGroup(), null, "groups", null, 0, -1, FunctionLibraryPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryPackage_Converters(), this.getFunctionLibraryConverterGroup(), null, "converters", null, 0, -1, FunctionLibraryPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryGroupEClass, FunctionLibraryGroup.class, "FunctionLibraryGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFunctionLibraryGroup_Name(), theEcorePackage.getEString(), "name", null, 0, 1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Functions(), this.getFunctionLibraryFunction(), null, "functions", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Rates(), this.getFunctionLibraryRate(), null, "rates", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Tests(), this.getFunctionLibraryTest(), null, "tests", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Guards(), this.getFunctionLibraryGuard(), null, "guards", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Operations(), this.getFunctionLibraryOperation(), null, "operations", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Executes(), this.getFunctionLibraryExecute(), null, "executes", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_CanExecutes(), this.getFunctionLibraryCanExecute(), null, "canExecutes", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Validators(), this.getFunctionLibraryValidation(), null, "validators", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_Initializators(), this.getFunctionLibraryInitialization(), null, "initializators", null, 0, -1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_ConvertToModel(), this.getFunctionConvertToModel(), null, "convertToModel", null, 0, 1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryGroup_ConvertToPresentation(), this.getFunctionConvertToPresentation(), null, "convertToPresentation", null, 0, 1, FunctionLibraryGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryBlipGroupEClass, FunctionLibraryBlipGroup.class, "FunctionLibraryBlipGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryStatemachineGroupEClass, FunctionLibraryStatemachineGroup.class, "FunctionLibraryStatemachineGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryValidationGroupEClass, FunctionLibraryValidationGroup.class, "FunctionLibraryValidationGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryInitializationGroupEClass, FunctionLibraryInitializationGroup.class, "FunctionLibraryInitializationGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryActionGroupEClass, FunctionLibraryActionGroup.class, "FunctionLibraryActionGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryConverterGroupEClass, FunctionLibraryConverterGroup.class, "FunctionLibraryConverterGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionLibraryConverterGroup_ConvertToModelDatatype(), theOSBPTypesPackage.getLDataType(), null, "convertToModelDatatype", null, 0, 1, FunctionLibraryConverterGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryConverterGroup_ConvertToPresentationDatatype(), theOSBPTypesPackage.getLDataType(), null, "convertToPresentationDatatype", null, 0, 1, FunctionLibraryConverterGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryRatingEClass, FunctionLibraryRating.class, "FunctionLibraryRating", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFunctionLibraryRating_Name(), theEcorePackage.getEString(), "name", null, 0, 1, FunctionLibraryRating.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryRating_Items(), this.getFunctionLibraryRatingItem(), null, "items", null, 0, -1, FunctionLibraryRating.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryRatingItemEClass, FunctionLibraryRatingItem.class, "FunctionLibraryRatingItem", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFunctionLibraryRatingItem_Name(), theEcorePackage.getEString(), "name", null, 0, 1, FunctionLibraryRatingItem.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryBaseFunctionEClass, FunctionLibraryBaseFunction.class, "FunctionLibraryBaseFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFunctionLibraryBaseFunction_Name(), theEcorePackage.getEString(), "name", null, 0, 1, FunctionLibraryBaseFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryBaseFunction_Params(), this.getFunctionLibraryParameter(), null, "params", null, 0, -1, FunctionLibraryBaseFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryBaseFunction_Body(), theXbasePackage.getXExpression(), null, "body", null, 0, 1, FunctionLibraryBaseFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryFunctionEClass, FunctionLibraryFunction.class, "FunctionLibraryFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionLibraryFunction_Oftype(), theTypesPackage.getJvmParameterizedTypeReference(), null, "oftype", null, 0, 1, FunctionLibraryFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryTestEClass, FunctionLibraryTest.class, "FunctionLibraryTest", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryRateEClass, FunctionLibraryRate.class, "FunctionLibraryRate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionLibraryRate_Oftype(), this.getFunctionLibraryRating(), null, "oftype", null, 0, 1, FunctionLibraryRate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(functionLibraryGuardEClass, FunctionLibraryGuard.class, "FunctionLibraryGuard", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryOperationEClass, FunctionLibraryOperation.class, "FunctionLibraryOperation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryExecuteEClass, FunctionLibraryExecute.class, "FunctionLibraryExecute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryCanExecuteEClass, FunctionLibraryCanExecute.class, "FunctionLibraryCanExecute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryValidationEClass, FunctionLibraryValidation.class, "FunctionLibraryValidation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryInitializationEClass, FunctionLibraryInitialization.class, "FunctionLibraryInitialization", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionConvertToModelEClass, FunctionConvertToModel.class, "FunctionConvertToModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionConvertToPresentationEClass, FunctionConvertToPresentation.class, "FunctionConvertToPresentation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(functionLibraryParameterEClass, FunctionLibraryParameter.class, "FunctionLibraryParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFunctionLibraryParameter_Name(), theEcorePackage.getEString(), "name", null, 0, 1, FunctionLibraryParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getFunctionLibraryParameter_ParameterType(), theTypesPackage.getJvmTypeReference(), null, "parameterType", null, 0, 1, FunctionLibraryParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Create resource
		createResource(eNS_URI);

		// Create annotations
		// http://www.eclipse.org/emf/2002/Ecore
		createEcoreAnnotations();
	}

	/**
	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/Ecore</b>.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void createEcoreAnnotations() {
		String source = "http://www.eclipse.org/emf/2002/Ecore";	
		addAnnotation
		  (this, 
		   source, 
		   new String[] {
			 "rootPackage", "functionLibraryDSL"
		   });
	}

} //FunctionLibraryDSLPackageImpl
