/**
 * 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 v1.0 
 *  which accompanies this distribution, and is available at 
 *  http://www.eclipse.org/legal/epl-v10.html 
 * 
 *  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.common.util.EList;

import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;

import org.eclipse.xtext.xbase.XExpression;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Entity Mock Entity Function</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getAttributeRef <em>Attribute Ref</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getParams <em>Params</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getBody <em>Body</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunction()
 * @model
 * @generated
 */
public interface EntityMockEntityFunction extends IEntityMockEntityUsable {
	/**
	 * Returns the value of the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Attribute Ref</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Attribute Ref</em>' reference.
	 * @see #setAttributeRef(LEntityAttribute)
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunction_AttributeRef()
	 * @model
	 * @generated
	 */
	LEntityAttribute getAttributeRef();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getAttributeRef <em>Attribute Ref</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Attribute Ref</em>' reference.
	 * @see #getAttributeRef()
	 * @generated
	 */
	void setAttributeRef(LEntityAttribute value);

	/**
	 * Returns the value of the '<em><b>Params</b></em>' containment reference list.
	 * The list contents are of type {@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Params</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Params</em>' containment reference list.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunction_Params()
	 * @model containment="true"
	 * @generated
	 */
	EList<EntityMockEntityFunctionParameter> getParams();

	/**
	 * Returns the value of the '<em><b>Body</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Body</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Body</em>' containment reference.
	 * @see #setBody(XExpression)
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunction_Body()
	 * @model containment="true"
	 * @generated
	 */
	XExpression getBody();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getBody <em>Body</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Body</em>' containment reference.
	 * @see #getBody()
	 * @generated
	 */
	void setBody(XExpression value);

} // EntityMockEntityFunction
