/**
 *  * Copyright (c) 2008 Daniel Varro
 *  * All rights reserved. This program and the accompanying materials
 *  * are made available under the terms of the Eclipse Public License v1.0
 *  * which accompanies this distribution, and is available at
 *  * http://www.eclipse.org/legal/epl-v10.html
 *  *
 *  * Contributors:
 *  *    Daniel Varro - initial API and implementation
 * 
 *
 * $Id$
 */
package org.eclipse.viatra2.gtasm.typerules.impl;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.impl.EFactoryImpl;

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.viatra2.gtasm.typerules.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class TyperulesFactoryImpl extends EFactoryImpl implements TyperulesFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static TyperulesFactory init() {
		try {
			TyperulesFactory theTyperulesFactory = (TyperulesFactory)EPackage.Registry.INSTANCE.getEFactory("http:///typerules.ecore"); 
			if (theTyperulesFactory != null) {
				return theTyperulesFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new TyperulesFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TyperulesFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case TyperulesPackage.RULE_SET: return createRuleSet();
			case TyperulesPackage.UNARY_TYPE_JUDGEMENT: return createUnaryTypeJudgement();
			case TyperulesPackage.BINARY_TYPE_JUDGEMENT: return createBinaryTypeJudgement();
			case TyperulesPackage.TYPE_RULE: return createTypeRule();
			case TyperulesPackage.CUSTOM_TYPE_JUDGEMENT: return createCustomTypeJudgement();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RuleSet createRuleSet() {
		RuleSetImpl ruleSet = new RuleSetImpl();
		return ruleSet;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UnaryTypeJudgement createUnaryTypeJudgement() {
		UnaryTypeJudgementImpl unaryTypeJudgement = new UnaryTypeJudgementImpl();
		return unaryTypeJudgement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BinaryTypeJudgement createBinaryTypeJudgement() {
		BinaryTypeJudgementImpl binaryTypeJudgement = new BinaryTypeJudgementImpl();
		return binaryTypeJudgement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TypeRule createTypeRule() {
		TypeRuleImpl typeRule = new TypeRuleImpl();
		return typeRule;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CustomTypeJudgement createCustomTypeJudgement() {
		CustomTypeJudgementImpl customTypeJudgement = new CustomTypeJudgementImpl();
		return customTypeJudgement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TyperulesPackage getTyperulesPackage() {
		return (TyperulesPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static TyperulesPackage getPackage() {
		return TyperulesPackage.eINSTANCE;
	}

} //TyperulesFactoryImpl
