/**
 * 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
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from AuthoritarionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.authorizationdsl;

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

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

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Role Bean</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.authorizationdsl.RoleBean#getBeanAuthorized <em>Bean Authorized</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.authorizationdsl.RoleBean#getBeanFeatures <em>Bean Features</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.authorizationdsl.RoleBean#getBeanRef <em>Bean Ref</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage#getRoleBean()
 * @model
 * @generated
 */
public interface RoleBean extends RoleElement {
	/**
	 * Returns the value of the '<em><b>Bean Authorized</b></em>' attribute list.
	 * The list contents are of type {@link org.eclipse.osbp.xtext.authorizationdsl.RoleEnum}.
	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.authorizationdsl.RoleEnum}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Bean Authorized</em>' attribute list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Bean Authorized</em>' attribute list.
	 * @see org.eclipse.osbp.xtext.authorizationdsl.RoleEnum
	 * @see org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage#getRoleBean_BeanAuthorized()
	 * @model unique="false"
	 * @generated
	 */
	EList<RoleEnum> getBeanAuthorized();

	/**
	 * Returns the value of the '<em><b>Bean Features</b></em>' containment reference list.
	 * The list contents are of type {@link org.eclipse.osbp.xtext.authorizationdsl.RoleBeanFeature}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Bean Features</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>Bean Features</em>' containment reference list.
	 * @see org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage#getRoleBean_BeanFeatures()
	 * @model containment="true"
	 * @generated
	 */
	EList<RoleBeanFeature> getBeanFeatures();

	/**
	 * Returns the value of the '<em><b>Bean Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Bean 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>Bean Ref</em>' reference.
	 * @see #setBeanRef(LBean)
	 * @see org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage#getRoleBean_BeanRef()
	 * @model
	 * @generated
	 */
	LBean getBeanRef();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.authorizationdsl.RoleBean#getBeanRef <em>Bean Ref</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Bean Ref</em>' reference.
	 * @see #getBeanRef()
	 * @generated
	 */
	void setBeanRef(LBean value);

} // RoleBean
