/**
 * Copyright (c) 2020 CEA LIST, Committer Name, and others.
 * 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
 * 
 * Contributors:
 * CEA LIST - Initial API and implementation
 * Patrick Tessier (CEA LIST) patrick.tessier@cea.fr  
 * Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr  
 * 
 */
package org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR;

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

import org.eclipse.emf.ecore.EObject;

import org.eclipse.uml2.uml.NamedElement;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Purpose</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose#getBase_NamedElement <em>Base Named Element</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose#getProcesses <em>Processes</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose#getConsent <em>Consent</em>}</li>
 * </ul>
 *
 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Pdp4engCommonGDPRPackage#getPurpose()
 * @model
 * @generated
 */
public interface Purpose extends EObject {
	/**
	 * Returns the value of the '<em><b>Base Named Element</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Base Named Element</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Base Named Element</em>' reference.
	 * @see #setBase_NamedElement(NamedElement)
	 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Pdp4engCommonGDPRPackage#getPurpose_Base_NamedElement()
	 * @model ordered="false"
	 * @generated
	 */
	NamedElement getBase_NamedElement();

	/**
	 * Sets the value of the '{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose#getBase_NamedElement <em>Base Named Element</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Base Named Element</em>' reference.
	 * @see #getBase_NamedElement()
	 * @generated
	 */
	void setBase_NamedElement(NamedElement value);

	/**
	 * Returns the value of the '<em><b>Processes</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process}.
	 * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process#getContributedTo <em>Contributed To</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Processes</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Processes</em>' reference list.
	 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Pdp4engCommonGDPRPackage#getPurpose_Processes()
	 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process#getContributedTo
	 * @model opposite="contributedTo" required="true" ordered="false"
	 * @generated
	 */
	EList<org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process> getProcesses();

	/**
	 * Returns the value of the '<em><b>Consent</b></em>' reference.
	 * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Consent#getPurpose <em>Purpose</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Consent</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Consent</em>' reference.
	 * @see #setConsent(Consent)
	 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Pdp4engCommonGDPRPackage#getPurpose_Consent()
	 * @see org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Consent#getPurpose
	 * @model opposite="purpose" ordered="false"
	 * @generated
	 */
	Consent getConsent();

	/**
	 * Sets the value of the '{@link org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose#getConsent <em>Consent</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Consent</em>' reference.
	 * @see #getConsent()
	 * @generated
	 */
	void setConsent(Consent value);

} // Purpose
