/**
 * 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  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.entitymock;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage
 * @generated
 */
public interface EntityMockDSLFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	EntityMockDSLFactory eINSTANCE = org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Entity Mock Model</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Model</em>'.
	 * @generated
	 */
	EntityMockModel createEntityMockModel();

	/**
	 * Returns a new object of class '<em>Entity Mock Lazy Resolver</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Lazy Resolver</em>'.
	 * @generated
	 */
	EntityMockLazyResolver createEntityMockLazyResolver();

	/**
	 * Returns a new object of class '<em>Entity Mock Package</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Package</em>'.
	 * @generated
	 */
	EntityMockPackage createEntityMockPackage();

	/**
	 * Returns a new object of class '<em>Entity Mock</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock</em>'.
	 * @generated
	 */
	EntityMock createEntityMock();

	/**
	 * Returns a new object of class '<em>Running Data Interchanges</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Running Data Interchanges</em>'.
	 * @generated
	 */
	RunningDataInterchanges createRunningDataInterchanges();

	/**
	 * Returns a new object of class '<em>Running Data Interchange</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Running Data Interchange</em>'.
	 * @generated
	 */
	RunningDataInterchange createRunningDataInterchange();

	/**
	 * Returns a new object of class '<em>Entity Mock Resources</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Resources</em>'.
	 * @generated
	 */
	EntityMockResources createEntityMockResources();

	/**
	 * Returns a new object of class '<em>Entity Mock Resource</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Resource</em>'.
	 * @generated
	 */
	EntityMockResource createEntityMockResource();

	/**
	 * Returns a new object of class '<em>Entity Mock Resource Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Resource Attribute</em>'.
	 * @generated
	 */
	EntityMockResourceAttribute createEntityMockResourceAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Resource Data Row</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Resource Data Row</em>'.
	 * @generated
	 */
	EntityMockResourceDataRow createEntityMockResourceDataRow();

	/**
	 * Returns a new object of class '<em>Entity Mock Objects</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Objects</em>'.
	 * @generated
	 */
	EntityMockObjects createEntityMockObjects();

	/**
	 * Returns a new object of class '<em>Entity Mock Object</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object</em>'.
	 * @generated
	 */
	EntityMockObject createEntityMockObject();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Enum</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Enum</em>'.
	 * @generated
	 */
	EntityMockObjectEnum createEntityMockObjectEnum();

	/**
	 * Returns a new object of class '<em>IEntity Mock Object Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>IEntity Mock Object Attribute</em>'.
	 * @generated
	 */
	IEntityMockObjectAttribute createIEntityMockObjectAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Plain Value</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Plain Value</em>'.
	 * @generated
	 */
	EntityMockObjectPlainValue createEntityMockObjectPlainValue();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Resource Value</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Resource Value</em>'.
	 * @generated
	 */
	EntityMockObjectResourceValue createEntityMockObjectResourceValue();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Array Value</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Array Value</em>'.
	 * @generated
	 */
	EntityMockObjectArrayValue createEntityMockObjectArrayValue();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Item Value</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Item Value</em>'.
	 * @generated
	 */
	EntityMockObjectItemValue createEntityMockObjectItemValue();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Embed</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Embed</em>'.
	 * @generated
	 */
	EntityMockObjectEmbed createEntityMockObjectEmbed();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Function</em>'.
	 * @generated
	 */
	EntityMockObjectFunction createEntityMockObjectFunction();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Function Parameter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Function Parameter</em>'.
	 * @generated
	 */
	EntityMockObjectFunctionParameter createEntityMockObjectFunctionParameter();

	/**
	 * Returns a new object of class '<em>Entity Mock Object Fill</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Object Fill</em>'.
	 * @generated
	 */
	EntityMockObjectFill createEntityMockObjectFill();

	/**
	 * Returns a new object of class '<em>Property Filler Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Type</em>'.
	 * @generated
	 */
	PropertyFillerType createPropertyFillerType();

	/**
	 * Returns a new object of class '<em>Property Filler Date Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Type</em>'.
	 * @generated
	 */
	PropertyFillerDateType createPropertyFillerDateType();

	/**
	 * Returns a new object of class '<em>Property Filler Boolean</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Boolean</em>'.
	 * @generated
	 */
	PropertyFillerBoolean createPropertyFillerBoolean();

	/**
	 * Returns a new object of class '<em>Property Filler Double Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Double Type</em>'.
	 * @generated
	 */
	PropertyFillerDoubleType createPropertyFillerDoubleType();

	/**
	 * Returns a new object of class '<em>Property Filler Integer Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Integer Type</em>'.
	 * @generated
	 */
	PropertyFillerIntegerType createPropertyFillerIntegerType();

	/**
	 * Returns a new object of class '<em>Property Filler Text Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Type</em>'.
	 * @generated
	 */
	PropertyFillerTextType createPropertyFillerTextType();

	/**
	 * Returns a new object of class '<em>Property Filler Date Future</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Future</em>'.
	 * @generated
	 */
	PropertyFillerDateFuture createPropertyFillerDateFuture();

	/**
	 * Returns a new object of class '<em>Property Filler Date Past</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Past</em>'.
	 * @generated
	 */
	PropertyFillerDatePast createPropertyFillerDatePast();

	/**
	 * Returns a new object of class '<em>Property Filler Date Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Range</em>'.
	 * @generated
	 */
	PropertyFillerDateRange createPropertyFillerDateRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Double Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Double Range</em>'.
	 * @generated
	 */
	PropertyFillerSignedDoubleRange createPropertyFillerSignedDoubleRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Double Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Double Random</em>'.
	 * @generated
	 */
	PropertyFillerSignedDoubleRandom createPropertyFillerSignedDoubleRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Integer Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Integer Range</em>'.
	 * @generated
	 */
	PropertyFillerSignedIntegerRange createPropertyFillerSignedIntegerRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Integer Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Integer Random</em>'.
	 * @generated
	 */
	PropertyFillerSignedIntegerRandom createPropertyFillerSignedIntegerRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Text Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Random</em>'.
	 * @generated
	 */
	PropertyFillerTextRandom createPropertyFillerTextRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Text Paragraphs</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Paragraphs</em>'.
	 * @generated
	 */
	PropertyFillerTextParagraphs createPropertyFillerTextParagraphs();

	/**
	 * Returns a new object of class '<em>Property Filler Text Sentences</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Sentences</em>'.
	 * @generated
	 */
	PropertyFillerTextSentences createPropertyFillerTextSentences();

	/**
	 * Returns a new object of class '<em>Property Filler Text Words</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Words</em>'.
	 * @generated
	 */
	PropertyFillerTextWords createPropertyFillerTextWords();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Double Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Double Range</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedDoubleRange createPropertyFillerUnsignedDoubleRange();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Double Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Double Random</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedDoubleRandom createPropertyFillerUnsignedDoubleRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Integer Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Integer Range</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedIntegerRange createPropertyFillerUnsignedIntegerRange();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Integer Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Integer Random</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedIntegerRandom createPropertyFillerUnsignedIntegerRandom();

	/**
	 * Returns a new object of class '<em>Entity Mock Entities</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Entities</em>'.
	 * @generated
	 */
	EntityMockEntities createEntityMockEntities();

	/**
	 * Returns a new object of class '<em>Entity Mock Entity</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Entity</em>'.
	 * @generated
	 */
	EntityMockEntity createEntityMockEntity();

	/**
	 * Returns a new object of class '<em>IIterate</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>IIterate</em>'.
	 * @generated
	 */
	IIterate createIIterate();

	/**
	 * Returns a new object of class '<em>Integer Iterate</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Integer Iterate</em>'.
	 * @generated
	 */
	IntegerIterate createIntegerIterate();

	/**
	 * Returns a new object of class '<em>Date Iterate</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Date Iterate</em>'.
	 * @generated
	 */
	DateIterate createDateIterate();

	/**
	 * Returns a new object of class '<em>Date</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Date</em>'.
	 * @generated
	 */
	Date createDate();

	/**
	 * Returns a new object of class '<em>Entity Mock By Resource Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock By Resource Attribute</em>'.
	 * @generated
	 */
	EntityMockByResourceAttribute createEntityMockByResourceAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Template</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Template</em>'.
	 * @generated
	 */
	EntityMockTemplate createEntityMockTemplate();

	/**
	 * Returns a new object of class '<em>IEntity Mock Object Usable</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>IEntity Mock Object Usable</em>'.
	 * @generated
	 */
	IEntityMockObjectUsable createIEntityMockObjectUsable();

	/**
	 * Returns a new object of class '<em>IEntity Mock Entity Usable</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>IEntity Mock Entity Usable</em>'.
	 * @generated
	 */
	IEntityMockEntityUsable createIEntityMockEntityUsable();

	/**
	 * Returns a new object of class '<em>IEntity Mock Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>IEntity Mock Attribute</em>'.
	 * @generated
	 */
	IEntityMockAttribute createIEntityMockAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Referenced Object Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Referenced Object Attribute</em>'.
	 * @generated
	 */
	EntityMockReferencedObjectAttribute createEntityMockReferencedObjectAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Attribute By Object</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Attribute By Object</em>'.
	 * @generated
	 */
	EntityMockAttributeByObject createEntityMockAttributeByObject();

	/**
	 * Returns a new object of class '<em>Entity Mock Attribute Filler</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Attribute Filler</em>'.
	 * @generated
	 */
	EntityMockAttributeFiller createEntityMockAttributeFiller();

	/**
	 * Returns a new object of class '<em>Entity Mock Attribute By Reference</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Attribute By Reference</em>'.
	 * @generated
	 */
	EntityMockAttributeByReference createEntityMockAttributeByReference();

	/**
	 * Returns a new object of class '<em>Entity Mock Entity Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Entity Function</em>'.
	 * @generated
	 */
	EntityMockEntityFunction createEntityMockEntityFunction();

	/**
	 * Returns a new object of class '<em>Entity Mock Entity Nested Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Entity Nested Attribute</em>'.
	 * @generated
	 */
	EntityMockEntityNestedAttribute createEntityMockEntityNestedAttribute();

	/**
	 * Returns a new object of class '<em>Entity Mock Entity Function Parameter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Entity Mock Entity Function Parameter</em>'.
	 * @generated
	 */
	EntityMockEntityFunctionParameter createEntityMockEntityFunctionParameter();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	EntityMockDSLPackage getEntityMockDSLPackage();

} //EntityMockDSLFactory
