/**
 * 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 java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;

import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;

import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionConvertToModel;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionConvertToPresentation;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryCanExecute;
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.FunctionLibraryOperation;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryRate;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryTest;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryValidation;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Function Library Group</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getName <em>Name</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getFunctions <em>Functions</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getRates <em>Rates</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getTests <em>Tests</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getGuards <em>Guards</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getOperations <em>Operations</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getExecutes <em>Executes</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getCanExecutes <em>Can Executes</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getValidators <em>Validators</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getInitializators <em>Initializators</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getConvertToModel <em>Convert To Model</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.functionlibrarydsl.impl.FunctionLibraryGroupImpl#getConvertToPresentation <em>Convert To Presentation</em>}</li>
 * </ul>
 *
 * @generated
 */
public class FunctionLibraryGroupImpl extends MinimalEObjectImpl.Container implements FunctionLibraryGroup {
	/**
	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getName()
	 * @generated
	 * @ordered
	 */
	protected static final String NAME_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getName()
	 * @generated
	 * @ordered
	 */
	protected String name = NAME_EDEFAULT;

	/**
	 * The cached value of the '{@link #getFunctions() <em>Functions</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getFunctions()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryFunction> functions;

	/**
	 * The cached value of the '{@link #getRates() <em>Rates</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getRates()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryRate> rates;

	/**
	 * The cached value of the '{@link #getTests() <em>Tests</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getTests()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryTest> tests;

	/**
	 * The cached value of the '{@link #getGuards() <em>Guards</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getGuards()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryGuard> guards;

	/**
	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOperations()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryOperation> operations;

	/**
	 * The cached value of the '{@link #getExecutes() <em>Executes</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getExecutes()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryExecute> executes;

	/**
	 * The cached value of the '{@link #getCanExecutes() <em>Can Executes</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCanExecutes()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryCanExecute> canExecutes;

	/**
	 * The cached value of the '{@link #getValidators() <em>Validators</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getValidators()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryValidation> validators;

	/**
	 * The cached value of the '{@link #getInitializators() <em>Initializators</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getInitializators()
	 * @generated
	 * @ordered
	 */
	protected EList<FunctionLibraryInitialization> initializators;

	/**
	 * The cached value of the '{@link #getConvertToModel() <em>Convert To Model</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getConvertToModel()
	 * @generated
	 * @ordered
	 */
	protected FunctionConvertToModel convertToModel;

	/**
	 * The cached value of the '{@link #getConvertToPresentation() <em>Convert To Presentation</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getConvertToPresentation()
	 * @generated
	 * @ordered
	 */
	protected FunctionConvertToPresentation convertToPresentation;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected FunctionLibraryGroupImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return FunctionLibraryDSLPackage.Literals.FUNCTION_LIBRARY_GROUP;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getName() {
		return name;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setName(String newName) {
		String oldName = name;
		name = newName;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__NAME, oldName, name));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryFunction> getFunctions() {
		if (functions == null) {
			functions = new EObjectContainmentEList<FunctionLibraryFunction>(FunctionLibraryFunction.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS);
		}
		return functions;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryRate> getRates() {
		if (rates == null) {
			rates = new EObjectContainmentEList<FunctionLibraryRate>(FunctionLibraryRate.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES);
		}
		return rates;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryTest> getTests() {
		if (tests == null) {
			tests = new EObjectContainmentEList<FunctionLibraryTest>(FunctionLibraryTest.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS);
		}
		return tests;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryGuard> getGuards() {
		if (guards == null) {
			guards = new EObjectContainmentEList<FunctionLibraryGuard>(FunctionLibraryGuard.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS);
		}
		return guards;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryOperation> getOperations() {
		if (operations == null) {
			operations = new EObjectContainmentEList<FunctionLibraryOperation>(FunctionLibraryOperation.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS);
		}
		return operations;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryExecute> getExecutes() {
		if (executes == null) {
			executes = new EObjectContainmentEList<FunctionLibraryExecute>(FunctionLibraryExecute.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES);
		}
		return executes;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryCanExecute> getCanExecutes() {
		if (canExecutes == null) {
			canExecutes = new EObjectContainmentEList<FunctionLibraryCanExecute>(FunctionLibraryCanExecute.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES);
		}
		return canExecutes;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryValidation> getValidators() {
		if (validators == null) {
			validators = new EObjectContainmentEList<FunctionLibraryValidation>(FunctionLibraryValidation.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS);
		}
		return validators;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<FunctionLibraryInitialization> getInitializators() {
		if (initializators == null) {
			initializators = new EObjectContainmentEList<FunctionLibraryInitialization>(FunctionLibraryInitialization.class, this, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS);
		}
		return initializators;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionConvertToModel getConvertToModel() {
		return convertToModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetConvertToModel(FunctionConvertToModel newConvertToModel, NotificationChain msgs) {
		FunctionConvertToModel oldConvertToModel = convertToModel;
		convertToModel = newConvertToModel;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL, oldConvertToModel, newConvertToModel);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setConvertToModel(FunctionConvertToModel newConvertToModel) {
		if (newConvertToModel != convertToModel) {
			NotificationChain msgs = null;
			if (convertToModel != null)
				msgs = ((InternalEObject)convertToModel).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL, null, msgs);
			if (newConvertToModel != null)
				msgs = ((InternalEObject)newConvertToModel).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL, null, msgs);
			msgs = basicSetConvertToModel(newConvertToModel, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL, newConvertToModel, newConvertToModel));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionConvertToPresentation getConvertToPresentation() {
		return convertToPresentation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetConvertToPresentation(FunctionConvertToPresentation newConvertToPresentation, NotificationChain msgs) {
		FunctionConvertToPresentation oldConvertToPresentation = convertToPresentation;
		convertToPresentation = newConvertToPresentation;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION, oldConvertToPresentation, newConvertToPresentation);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setConvertToPresentation(FunctionConvertToPresentation newConvertToPresentation) {
		if (newConvertToPresentation != convertToPresentation) {
			NotificationChain msgs = null;
			if (convertToPresentation != null)
				msgs = ((InternalEObject)convertToPresentation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION, null, msgs);
			if (newConvertToPresentation != null)
				msgs = ((InternalEObject)newConvertToPresentation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION, null, msgs);
			msgs = basicSetConvertToPresentation(newConvertToPresentation, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION, newConvertToPresentation, newConvertToPresentation));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS:
				return ((InternalEList<?>)getFunctions()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES:
				return ((InternalEList<?>)getRates()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS:
				return ((InternalEList<?>)getTests()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS:
				return ((InternalEList<?>)getGuards()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS:
				return ((InternalEList<?>)getOperations()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES:
				return ((InternalEList<?>)getExecutes()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES:
				return ((InternalEList<?>)getCanExecutes()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS:
				return ((InternalEList<?>)getValidators()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS:
				return ((InternalEList<?>)getInitializators()).basicRemove(otherEnd, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL:
				return basicSetConvertToModel(null, msgs);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION:
				return basicSetConvertToPresentation(null, msgs);
		}
		return super.eInverseRemove(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__NAME:
				return getName();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS:
				return getFunctions();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES:
				return getRates();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS:
				return getTests();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS:
				return getGuards();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS:
				return getOperations();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES:
				return getExecutes();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES:
				return getCanExecutes();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS:
				return getValidators();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS:
				return getInitializators();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL:
				return getConvertToModel();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION:
				return getConvertToPresentation();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__NAME:
				setName((String)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS:
				getFunctions().clear();
				getFunctions().addAll((Collection<? extends FunctionLibraryFunction>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES:
				getRates().clear();
				getRates().addAll((Collection<? extends FunctionLibraryRate>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS:
				getTests().clear();
				getTests().addAll((Collection<? extends FunctionLibraryTest>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS:
				getGuards().clear();
				getGuards().addAll((Collection<? extends FunctionLibraryGuard>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS:
				getOperations().clear();
				getOperations().addAll((Collection<? extends FunctionLibraryOperation>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES:
				getExecutes().clear();
				getExecutes().addAll((Collection<? extends FunctionLibraryExecute>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES:
				getCanExecutes().clear();
				getCanExecutes().addAll((Collection<? extends FunctionLibraryCanExecute>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS:
				getValidators().clear();
				getValidators().addAll((Collection<? extends FunctionLibraryValidation>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS:
				getInitializators().clear();
				getInitializators().addAll((Collection<? extends FunctionLibraryInitialization>)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL:
				setConvertToModel((FunctionConvertToModel)newValue);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION:
				setConvertToPresentation((FunctionConvertToPresentation)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__NAME:
				setName(NAME_EDEFAULT);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS:
				getFunctions().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES:
				getRates().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS:
				getTests().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS:
				getGuards().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS:
				getOperations().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES:
				getExecutes().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES:
				getCanExecutes().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS:
				getValidators().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS:
				getInitializators().clear();
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL:
				setConvertToModel((FunctionConvertToModel)null);
				return;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION:
				setConvertToPresentation((FunctionConvertToPresentation)null);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__NAME:
				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__FUNCTIONS:
				return functions != null && !functions.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__RATES:
				return rates != null && !rates.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__TESTS:
				return tests != null && !tests.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__GUARDS:
				return guards != null && !guards.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__OPERATIONS:
				return operations != null && !operations.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__EXECUTES:
				return executes != null && !executes.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CAN_EXECUTES:
				return canExecutes != null && !canExecutes.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__VALIDATORS:
				return validators != null && !validators.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__INITIALIZATORS:
				return initializators != null && !initializators.isEmpty();
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_MODEL:
				return convertToModel != null;
			case FunctionLibraryDSLPackage.FUNCTION_LIBRARY_GROUP__CONVERT_TO_PRESENTATION:
				return convertToPresentation != null;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (name: ");
		result.append(name);
		result.append(')');
		return result.toString();
	}

} //FunctionLibraryGroupImpl
