/**
 * Copyright (c) 2011, 2017 - 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:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.statemachine.util;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.util.Switch;

import org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver;
import org.eclipse.osbp.dsl.semantic.common.types.LPackage;

import org.eclipse.osbp.xtext.statemachine.*;

/**
 * <!-- begin-user-doc -->
 * The <b>Switch</b> for the model's inheritance hierarchy.
 * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
 * to invoke the <code>caseXXX</code> method for each class of the model,
 * starting with the actual class of the object
 * and proceeding up the inheritance hierarchy
 * until a non-null result is returned,
 * which is the result of the switch.
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.statemachine.StatemachineDSLPackage
 * @generated
 */
public class StatemachineDSLSwitch<T> extends Switch<T> {
	/**
	 * The cached model package
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected static StatemachineDSLPackage modelPackage;

	/**
	 * Creates an instance of the switch.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StatemachineDSLSwitch() {
		if (modelPackage == null) {
			modelPackage = StatemachineDSLPackage.eINSTANCE;
		}
	}

	/**
	 * Checks whether this is a switch for the given package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param ePackage the package in question.
	 * @return whether this is a switch for the given package.
	 * @generated
	 */
	@Override
	protected boolean isSwitchFor(EPackage ePackage) {
		return ePackage == modelPackage;
	}

	/**
	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the first non-null result returned by a <code>caseXXX</code> call.
	 * @generated
	 */
	@Override
	protected T doSwitch(int classifierID, EObject theEObject) {
		switch (classifierID) {
			case StatemachineDSLPackage.FSM_MODEL: {
				FSMModel fsmModel = (FSMModel)theEObject;
				T result = caseFSMModel(fsmModel);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_LAZY_RESOLVER: {
				FSMLazyResolver fsmLazyResolver = (FSMLazyResolver)theEObject;
				T result = caseFSMLazyResolver(fsmLazyResolver);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_BASE: {
				FSMBase fsmBase = (FSMBase)theEObject;
				T result = caseFSMBase(fsmBase);
				if (result == null) result = caseFSMLazyResolver(fsmBase);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PACKAGE: {
				FSMPackage fsmPackage = (FSMPackage)theEObject;
				T result = caseFSMPackage(fsmPackage);
				if (result == null) result = caseLPackage(fsmPackage);
				if (result == null) result = caseLLazyResolver(fsmPackage);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM: {
				FSM fsm = (FSM)theEObject;
				T result = caseFSM(fsm);
				if (result == null) result = caseFSMBase(fsm);
				if (result == null) result = caseFSMLazyResolver(fsm);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL: {
				FSMControl fsmControl = (FSMControl)theEObject;
				T result = caseFSMControl(fsmControl);
				if (result == null) result = caseFSMBase(fsmControl);
				if (result == null) result = caseFSMLazyResolver(fsmControl);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON: {
				FSMControlButton fsmControlButton = (FSMControlButton)theEObject;
				T result = caseFSMControlButton(fsmControlButton);
				if (result == null) result = caseFSMControl(fsmControlButton);
				if (result == null) result = caseFSMControlVisibility(fsmControlButton);
				if (result == null) result = caseFSMBase(fsmControlButton);
				if (result == null) result = caseFSMLazyResolver(fsmControlButton);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_FIELD: {
				FSMControlField fsmControlField = (FSMControlField)theEObject;
				T result = caseFSMControlField(fsmControlField);
				if (result == null) result = caseFSMControl(fsmControlField);
				if (result == null) result = caseFSMBase(fsmControlField);
				if (result == null) result = caseFSMLazyResolver(fsmControlField);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_DTO: {
				FSMControlDTO fsmControlDTO = (FSMControlDTO)theEObject;
				T result = caseFSMControlDTO(fsmControlDTO);
				if (result == null) result = caseFSMControl(fsmControlDTO);
				if (result == null) result = caseFSMBase(fsmControlDTO);
				if (result == null) result = caseFSMLazyResolver(fsmControlDTO);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_SCHEDULER: {
				FSMControlScheduler fsmControlScheduler = (FSMControlScheduler)theEObject;
				T result = caseFSMControlScheduler(fsmControlScheduler);
				if (result == null) result = caseFSMControl(fsmControlScheduler);
				if (result == null) result = caseFSMBase(fsmControlScheduler);
				if (result == null) result = caseFSMLazyResolver(fsmControlScheduler);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_PERIPHERAL: {
				FSMControlPeripheral fsmControlPeripheral = (FSMControlPeripheral)theEObject;
				T result = caseFSMControlPeripheral(fsmControlPeripheral);
				if (result == null) result = caseFSMControl(fsmControlPeripheral);
				if (result == null) result = caseFSMBase(fsmControlPeripheral);
				if (result == null) result = caseFSMLazyResolver(fsmControlPeripheral);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON_ATTRIBUTE: {
				FSMControlButtonAttribute fsmControlButtonAttribute = (FSMControlButtonAttribute)theEObject;
				T result = caseFSMControlButtonAttribute(fsmControlButtonAttribute);
				if (result == null) result = caseFSMControlVisibility(fsmControlButtonAttribute);
				if (result == null) result = caseFSMBase(fsmControlButtonAttribute);
				if (result == null) result = caseFSMLazyResolver(fsmControlButtonAttribute);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON_ATTRIBUTE_EVENT: {
				FSMControlButtonAttributeEvent fsmControlButtonAttributeEvent = (FSMControlButtonAttributeEvent)theEObject;
				T result = caseFSMControlButtonAttributeEvent(fsmControlButtonAttributeEvent);
				if (result == null) result = caseFSMLazyResolver(fsmControlButtonAttributeEvent);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON_ATTRIBUTE_EVENT_KEYBOARD: {
				FSMControlButtonAttributeEventKeyboard fsmControlButtonAttributeEventKeyboard = (FSMControlButtonAttributeEventKeyboard)theEObject;
				T result = caseFSMControlButtonAttributeEventKeyboard(fsmControlButtonAttributeEventKeyboard);
				if (result == null) result = caseFSMControlButtonAttributeEvent(fsmControlButtonAttributeEventKeyboard);
				if (result == null) result = caseFSMLazyResolver(fsmControlButtonAttributeEventKeyboard);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON_ATTRIBUTE_EVENT_IDENTITY: {
				FSMControlButtonAttributeEventIdentity fsmControlButtonAttributeEventIdentity = (FSMControlButtonAttributeEventIdentity)theEObject;
				T result = caseFSMControlButtonAttributeEventIdentity(fsmControlButtonAttributeEventIdentity);
				if (result == null) result = caseFSMControlButtonAttributeEvent(fsmControlButtonAttributeEventIdentity);
				if (result == null) result = caseFSMLazyResolver(fsmControlButtonAttributeEventIdentity);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_BUTTON_ATTRIBUTE_EVENT_EVENT: {
				FSMControlButtonAttributeEventEvent fsmControlButtonAttributeEventEvent = (FSMControlButtonAttributeEventEvent)theEObject;
				T result = caseFSMControlButtonAttributeEventEvent(fsmControlButtonAttributeEventEvent);
				if (result == null) result = caseFSMControlButtonAttributeEvent(fsmControlButtonAttributeEventEvent);
				if (result == null) result = caseFSMLazyResolver(fsmControlButtonAttributeEventEvent);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_VISIBILITY: {
				FSMControlVisibility fsmControlVisibility = (FSMControlVisibility)theEObject;
				T result = caseFSMControlVisibility(fsmControlVisibility);
				if (result == null) result = caseFSMBase(fsmControlVisibility);
				if (result == null) result = caseFSMLazyResolver(fsmControlVisibility);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_FIELD_ATTRIBUTE: {
				FSMControlFieldAttribute fsmControlFieldAttribute = (FSMControlFieldAttribute)theEObject;
				T result = caseFSMControlFieldAttribute(fsmControlFieldAttribute);
				if (result == null) result = caseFSMControlVisibility(fsmControlFieldAttribute);
				if (result == null) result = caseFSMBase(fsmControlFieldAttribute);
				if (result == null) result = caseFSMLazyResolver(fsmControlFieldAttribute);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_FIELD_LAYOUT: {
				FSMControlFieldLayout fsmControlFieldLayout = (FSMControlFieldLayout)theEObject;
				T result = caseFSMControlFieldLayout(fsmControlFieldLayout);
				if (result == null) result = caseFSMControlVisibility(fsmControlFieldLayout);
				if (result == null) result = caseFSMBase(fsmControlFieldLayout);
				if (result == null) result = caseFSMLazyResolver(fsmControlFieldLayout);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_DTO_ATTRIBUTE: {
				FSMControlDTOAttribute fsmControlDTOAttribute = (FSMControlDTOAttribute)theEObject;
				T result = caseFSMControlDTOAttribute(fsmControlDTOAttribute);
				if (result == null) result = caseFSMBase(fsmControlDTOAttribute);
				if (result == null) result = caseFSMLazyResolver(fsmControlDTOAttribute);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE: {
				FSMPeripheralDevice fsmPeripheralDevice = (FSMPeripheralDevice)theEObject;
				T result = caseFSMPeripheralDevice(fsmPeripheralDevice);
				if (result == null) result = caseFSMBase(fsmPeripheralDevice);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDevice);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_DISPLAY: {
				FSMPeripheralDeviceDisplay fsmPeripheralDeviceDisplay = (FSMPeripheralDeviceDisplay)theEObject;
				T result = caseFSMPeripheralDeviceDisplay(fsmPeripheralDeviceDisplay);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDeviceDisplay);
				if (result == null) result = caseFSMBase(fsmPeripheralDeviceDisplay);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDeviceDisplay);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_LINE_DISPLAY: {
				FSMPeripheralDeviceLineDisplay fsmPeripheralDeviceLineDisplay = (FSMPeripheralDeviceLineDisplay)theEObject;
				T result = caseFSMPeripheralDeviceLineDisplay(fsmPeripheralDeviceLineDisplay);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDeviceLineDisplay);
				if (result == null) result = caseFSMBase(fsmPeripheralDeviceLineDisplay);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDeviceLineDisplay);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_POS_PRINTER: {
				FSMPeripheralDevicePOSPrinter fsmPeripheralDevicePOSPrinter = (FSMPeripheralDevicePOSPrinter)theEObject;
				T result = caseFSMPeripheralDevicePOSPrinter(fsmPeripheralDevicePOSPrinter);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDevicePOSPrinter);
				if (result == null) result = caseFSMBase(fsmPeripheralDevicePOSPrinter);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDevicePOSPrinter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_CASH_DRAWER: {
				FSMPeripheralDeviceCashDrawer fsmPeripheralDeviceCashDrawer = (FSMPeripheralDeviceCashDrawer)theEObject;
				T result = caseFSMPeripheralDeviceCashDrawer(fsmPeripheralDeviceCashDrawer);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDeviceCashDrawer);
				if (result == null) result = caseFSMBase(fsmPeripheralDeviceCashDrawer);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDeviceCashDrawer);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_PT: {
				FSMPeripheralDevicePT fsmPeripheralDevicePT = (FSMPeripheralDevicePT)theEObject;
				T result = caseFSMPeripheralDevicePT(fsmPeripheralDevicePT);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDevicePT);
				if (result == null) result = caseFSMBase(fsmPeripheralDevicePT);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDevicePT);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_PERIPHERAL_DEVICE_SIGNATURE: {
				FSMPeripheralDeviceSignature fsmPeripheralDeviceSignature = (FSMPeripheralDeviceSignature)theEObject;
				T result = caseFSMPeripheralDeviceSignature(fsmPeripheralDeviceSignature);
				if (result == null) result = caseFSMPeripheralDevice(fsmPeripheralDeviceSignature);
				if (result == null) result = caseFSMBase(fsmPeripheralDeviceSignature);
				if (result == null) result = caseFSMLazyResolver(fsmPeripheralDeviceSignature);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_SCHEDULER_ATTRIBUTE: {
				FSMControlSchedulerAttribute fsmControlSchedulerAttribute = (FSMControlSchedulerAttribute)theEObject;
				T result = caseFSMControlSchedulerAttribute(fsmControlSchedulerAttribute);
				if (result == null) result = caseFSMBase(fsmControlSchedulerAttribute);
				if (result == null) result = caseFSMLazyResolver(fsmControlSchedulerAttribute);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_EVENT: {
				FSMEvent fsmEvent = (FSMEvent)theEObject;
				T result = caseFSMEvent(fsmEvent);
				if (result == null) result = caseFSMBase(fsmEvent);
				if (result == null) result = caseFSMLazyResolver(fsmEvent);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_STATE: {
				FSMState fsmState = (FSMState)theEObject;
				T result = caseFSMState(fsmState);
				if (result == null) result = caseFSMBase(fsmState);
				if (result == null) result = caseFSMLazyResolver(fsmState);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_TRIGGER: {
				FSMTrigger fsmTrigger = (FSMTrigger)theEObject;
				T result = caseFSMTrigger(fsmTrigger);
				if (result == null) result = caseFSMLazyResolver(fsmTrigger);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION: {
				FSMAction fsmAction = (FSMAction)theEObject;
				T result = caseFSMAction(fsmAction);
				if (result == null) result = caseFSMLazyResolver(fsmAction);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_BLINK_RATE: {
				FSMActionPeripheralBlinkRate fsmActionPeripheralBlinkRate = (FSMActionPeripheralBlinkRate)theEObject;
				T result = caseFSMActionPeripheralBlinkRate(fsmActionPeripheralBlinkRate);
				if (result == null) result = caseFSMAction(fsmActionPeripheralBlinkRate);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralBlinkRate);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_CLEAR: {
				FSMActionPeripheralClear fsmActionPeripheralClear = (FSMActionPeripheralClear)theEObject;
				T result = caseFSMActionPeripheralClear(fsmActionPeripheralClear);
				if (result == null) result = caseFSMAction(fsmActionPeripheralClear);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralClear);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_CREATE_WINDOW: {
				FSMActionPeripheralCreateWindow fsmActionPeripheralCreateWindow = (FSMActionPeripheralCreateWindow)theEObject;
				T result = caseFSMActionPeripheralCreateWindow(fsmActionPeripheralCreateWindow);
				if (result == null) result = caseFSMAction(fsmActionPeripheralCreateWindow);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralCreateWindow);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_CURSOR_TYPE: {
				FSMActionPeripheralCursorType fsmActionPeripheralCursorType = (FSMActionPeripheralCursorType)theEObject;
				T result = caseFSMActionPeripheralCursorType(fsmActionPeripheralCursorType);
				if (result == null) result = caseFSMAction(fsmActionPeripheralCursorType);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralCursorType);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_DESTROY_WINDOW: {
				FSMActionPeripheralDestroyWindow fsmActionPeripheralDestroyWindow = (FSMActionPeripheralDestroyWindow)theEObject;
				T result = caseFSMActionPeripheralDestroyWindow(fsmActionPeripheralDestroyWindow);
				if (result == null) result = caseFSMAction(fsmActionPeripheralDestroyWindow);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralDestroyWindow);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_DEVICE_BRIGHTNESS: {
				FSMActionPeripheralDeviceBrightness fsmActionPeripheralDeviceBrightness = (FSMActionPeripheralDeviceBrightness)theEObject;
				T result = caseFSMActionPeripheralDeviceBrightness(fsmActionPeripheralDeviceBrightness);
				if (result == null) result = caseFSMAction(fsmActionPeripheralDeviceBrightness);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralDeviceBrightness);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SHOW_BITMAP: {
				FSMActionPeripheralShowBitmap fsmActionPeripheralShowBitmap = (FSMActionPeripheralShowBitmap)theEObject;
				T result = caseFSMActionPeripheralShowBitmap(fsmActionPeripheralShowBitmap);
				if (result == null) result = caseFSMAction(fsmActionPeripheralShowBitmap);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralShowBitmap);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_DISPLAY_TEXT: {
				FSMActionPeripheralDisplayText fsmActionPeripheralDisplayText = (FSMActionPeripheralDisplayText)theEObject;
				T result = caseFSMActionPeripheralDisplayText(fsmActionPeripheralDisplayText);
				if (result == null) result = caseFSMAction(fsmActionPeripheralDisplayText);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralDisplayText);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_LINE_DISPLAY_TEXT: {
				FSMActionPeripheralLineDisplayText fsmActionPeripheralLineDisplayText = (FSMActionPeripheralLineDisplayText)theEObject;
				T result = caseFSMActionPeripheralLineDisplayText(fsmActionPeripheralLineDisplayText);
				if (result == null) result = caseFSMAction(fsmActionPeripheralLineDisplayText);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralLineDisplayText);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_LINE_DISPLAY_TEXT_AT: {
				FSMActionPeripheralLineDisplayTextAt fsmActionPeripheralLineDisplayTextAt = (FSMActionPeripheralLineDisplayTextAt)theEObject;
				T result = caseFSMActionPeripheralLineDisplayTextAt(fsmActionPeripheralLineDisplayTextAt);
				if (result == null) result = caseFSMAction(fsmActionPeripheralLineDisplayTextAt);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralLineDisplayTextAt);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_INTER_CHARACTER_WAIT: {
				FSMActionPeripheralInterCharacterWait fsmActionPeripheralInterCharacterWait = (FSMActionPeripheralInterCharacterWait)theEObject;
				T result = caseFSMActionPeripheralInterCharacterWait(fsmActionPeripheralInterCharacterWait);
				if (result == null) result = caseFSMAction(fsmActionPeripheralInterCharacterWait);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralInterCharacterWait);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_MARQUEE_FORMAT: {
				FSMActionPeripheralMarqueeFormat fsmActionPeripheralMarqueeFormat = (FSMActionPeripheralMarqueeFormat)theEObject;
				T result = caseFSMActionPeripheralMarqueeFormat(fsmActionPeripheralMarqueeFormat);
				if (result == null) result = caseFSMAction(fsmActionPeripheralMarqueeFormat);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralMarqueeFormat);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_MARQUEE_REPEAT_WAIT: {
				FSMActionPeripheralMarqueeRepeatWait fsmActionPeripheralMarqueeRepeatWait = (FSMActionPeripheralMarqueeRepeatWait)theEObject;
				T result = caseFSMActionPeripheralMarqueeRepeatWait(fsmActionPeripheralMarqueeRepeatWait);
				if (result == null) result = caseFSMAction(fsmActionPeripheralMarqueeRepeatWait);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralMarqueeRepeatWait);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_MARQUEE_TYPE: {
				FSMActionPeripheralMarqueeType fsmActionPeripheralMarqueeType = (FSMActionPeripheralMarqueeType)theEObject;
				T result = caseFSMActionPeripheralMarqueeType(fsmActionPeripheralMarqueeType);
				if (result == null) result = caseFSMAction(fsmActionPeripheralMarqueeType);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralMarqueeType);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_MARQUEE_UNIT_WAIT: {
				FSMActionPeripheralMarqueeUnitWait fsmActionPeripheralMarqueeUnitWait = (FSMActionPeripheralMarqueeUnitWait)theEObject;
				T result = caseFSMActionPeripheralMarqueeUnitWait(fsmActionPeripheralMarqueeUnitWait);
				if (result == null) result = caseFSMAction(fsmActionPeripheralMarqueeUnitWait);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralMarqueeUnitWait);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SCROLL: {
				FSMActionPeripheralScroll fsmActionPeripheralScroll = (FSMActionPeripheralScroll)theEObject;
				T result = caseFSMActionPeripheralScroll(fsmActionPeripheralScroll);
				if (result == null) result = caseFSMAction(fsmActionPeripheralScroll);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralScroll);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_OPEN_DRAWER: {
				FSMActionPeripheralOpenDrawer fsmActionPeripheralOpenDrawer = (FSMActionPeripheralOpenDrawer)theEObject;
				T result = caseFSMActionPeripheralOpenDrawer(fsmActionPeripheralOpenDrawer);
				if (result == null) result = caseFSMAction(fsmActionPeripheralOpenDrawer);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralOpenDrawer);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_BARCODE: {
				FSMActionPeripheralPrintBarcode fsmActionPeripheralPrintBarcode = (FSMActionPeripheralPrintBarcode)theEObject;
				T result = caseFSMActionPeripheralPrintBarcode(fsmActionPeripheralPrintBarcode);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintBarcode);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintBarcode);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_BITMAP: {
				FSMActionPeripheralPrintBitmap fsmActionPeripheralPrintBitmap = (FSMActionPeripheralPrintBitmap)theEObject;
				T result = caseFSMActionPeripheralPrintBitmap(fsmActionPeripheralPrintBitmap);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintBitmap);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintBitmap);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_DISPLAY_BITMAP: {
				FSMActionPeripheralDisplayBitmap fsmActionPeripheralDisplayBitmap = (FSMActionPeripheralDisplayBitmap)theEObject;
				T result = caseFSMActionPeripheralDisplayBitmap(fsmActionPeripheralDisplayBitmap);
				if (result == null) result = caseFSMAction(fsmActionPeripheralDisplayBitmap);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralDisplayBitmap);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_CUT: {
				FSMActionPeripheralPrintCut fsmActionPeripheralPrintCut = (FSMActionPeripheralPrintCut)theEObject;
				T result = caseFSMActionPeripheralPrintCut(fsmActionPeripheralPrintCut);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintCut);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintCut);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_REGISTER_BITMAP: {
				FSMActionPeripheralPrintRegisterBitmap fsmActionPeripheralPrintRegisterBitmap = (FSMActionPeripheralPrintRegisterBitmap)theEObject;
				T result = caseFSMActionPeripheralPrintRegisterBitmap(fsmActionPeripheralPrintRegisterBitmap);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintRegisterBitmap);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintRegisterBitmap);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_DISPLAY_REGISTER_BITMAP: {
				FSMActionPeripheralDisplayRegisterBitmap fsmActionPeripheralDisplayRegisterBitmap = (FSMActionPeripheralDisplayRegisterBitmap)theEObject;
				T result = caseFSMActionPeripheralDisplayRegisterBitmap(fsmActionPeripheralDisplayRegisterBitmap);
				if (result == null) result = caseFSMAction(fsmActionPeripheralDisplayRegisterBitmap);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralDisplayRegisterBitmap);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_NORMAL: {
				FSMActionPeripheralPrintNormal fsmActionPeripheralPrintNormal = (FSMActionPeripheralPrintNormal)theEObject;
				T result = caseFSMActionPeripheralPrintNormal(fsmActionPeripheralPrintNormal);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintNormal);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintNormal);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_OPEN: {
				FSMActionPeripheralPTOpen fsmActionPeripheralPTOpen = (FSMActionPeripheralPTOpen)theEObject;
				T result = caseFSMActionPeripheralPTOpen(fsmActionPeripheralPTOpen);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTOpen);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTOpen);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_CLOSE: {
				FSMActionPeripheralPTClose fsmActionPeripheralPTClose = (FSMActionPeripheralPTClose)theEObject;
				T result = caseFSMActionPeripheralPTClose(fsmActionPeripheralPTClose);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTClose);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTClose);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_REVERSAL: {
				FSMActionPeripheralPTReversal fsmActionPeripheralPTReversal = (FSMActionPeripheralPTReversal)theEObject;
				T result = caseFSMActionPeripheralPTReversal(fsmActionPeripheralPTReversal);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTReversal);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTReversal);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_ACKNOWLEDGE: {
				FSMActionPeripheralPTAcknowledge fsmActionPeripheralPTAcknowledge = (FSMActionPeripheralPTAcknowledge)theEObject;
				T result = caseFSMActionPeripheralPTAcknowledge(fsmActionPeripheralPTAcknowledge);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTAcknowledge);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTAcknowledge);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_REGISTRATION: {
				FSMActionPeripheralPTRegistration fsmActionPeripheralPTRegistration = (FSMActionPeripheralPTRegistration)theEObject;
				T result = caseFSMActionPeripheralPTRegistration(fsmActionPeripheralPTRegistration);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTRegistration);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTRegistration);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_AUTHORIZATION: {
				FSMActionPeripheralPTAuthorization fsmActionPeripheralPTAuthorization = (FSMActionPeripheralPTAuthorization)theEObject;
				T result = caseFSMActionPeripheralPTAuthorization(fsmActionPeripheralPTAuthorization);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTAuthorization);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTAuthorization);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_BEEPER: {
				FSMActionPeripheralBeeper fsmActionPeripheralBeeper = (FSMActionPeripheralBeeper)theEObject;
				T result = caseFSMActionPeripheralBeeper(fsmActionPeripheralBeeper);
				if (result == null) result = caseFSMAction(fsmActionPeripheralBeeper);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralBeeper);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PLAYER: {
				FSMActionPeripheralPlayer fsmActionPeripheralPlayer = (FSMActionPeripheralPlayer)theEObject;
				T result = caseFSMActionPeripheralPlayer(fsmActionPeripheralPlayer);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPlayer);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPlayer);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SOUND: {
				FSMActionPeripheralSound fsmActionPeripheralSound = (FSMActionPeripheralSound)theEObject;
				T result = caseFSMActionPeripheralSound(fsmActionPeripheralSound);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSound);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSound);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PT_RESPONSE: {
				FSMActionPeripheralPTResponse fsmActionPeripheralPTResponse = (FSMActionPeripheralPTResponse)theEObject;
				T result = caseFSMActionPeripheralPTResponse(fsmActionPeripheralPTResponse);
				if (result == null) result = caseFSMActionFieldSource(fsmActionPeripheralPTResponse);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPTResponse);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPTResponse);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_PRINT_REPORT: {
				FSMActionPeripheralPrintReport fsmActionPeripheralPrintReport = (FSMActionPeripheralPrintReport)theEObject;
				T result = caseFSMActionPeripheralPrintReport(fsmActionPeripheralPrintReport);
				if (result == null) result = caseFSMAction(fsmActionPeripheralPrintReport);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralPrintReport);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_OPEN: {
				FSMActionPeripheralSignatureOpen fsmActionPeripheralSignatureOpen = (FSMActionPeripheralSignatureOpen)theEObject;
				T result = caseFSMActionPeripheralSignatureOpen(fsmActionPeripheralSignatureOpen);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureOpen);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureOpen);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_CLOSE: {
				FSMActionPeripheralSignatureClose fsmActionPeripheralSignatureClose = (FSMActionPeripheralSignatureClose)theEObject;
				T result = caseFSMActionPeripheralSignatureClose(fsmActionPeripheralSignatureClose);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureClose);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureClose);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_CLEAR: {
				FSMActionPeripheralSignatureClear fsmActionPeripheralSignatureClear = (FSMActionPeripheralSignatureClear)theEObject;
				T result = caseFSMActionPeripheralSignatureClear(fsmActionPeripheralSignatureClear);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureClear);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureClear);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_CAPTURE: {
				FSMActionPeripheralSignatureCapture fsmActionPeripheralSignatureCapture = (FSMActionPeripheralSignatureCapture)theEObject;
				T result = caseFSMActionPeripheralSignatureCapture(fsmActionPeripheralSignatureCapture);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureCapture);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureCapture);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_IDLE: {
				FSMActionPeripheralSignatureIdle fsmActionPeripheralSignatureIdle = (FSMActionPeripheralSignatureIdle)theEObject;
				T result = caseFSMActionPeripheralSignatureIdle(fsmActionPeripheralSignatureIdle);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureIdle);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureIdle);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_PERIPHERAL_SIGNATURE_LABEL: {
				FSMActionPeripheralSignatureLabel fsmActionPeripheralSignatureLabel = (FSMActionPeripheralSignatureLabel)theEObject;
				T result = caseFSMActionPeripheralSignatureLabel(fsmActionPeripheralSignatureLabel);
				if (result == null) result = caseFSMAction(fsmActionPeripheralSignatureLabel);
				if (result == null) result = caseFSMLazyResolver(fsmActionPeripheralSignatureLabel);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_SIGNATURE_RETRIEVE: {
				FSMSignatureRetrieve fsmSignatureRetrieve = (FSMSignatureRetrieve)theEObject;
				T result = caseFSMSignatureRetrieve(fsmSignatureRetrieve);
				if (result == null) result = caseFSMActionFieldSource(fsmSignatureRetrieve);
				if (result == null) result = caseFSMAction(fsmSignatureRetrieve);
				if (result == null) result = caseFSMLazyResolver(fsmSignatureRetrieve);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE: {
				FSMActionFieldSource fsmActionFieldSource = (FSMActionFieldSource)theEObject;
				T result = caseFSMActionFieldSource(fsmActionFieldSource);
				if (result == null) result = caseFSMAction(fsmActionFieldSource);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSource);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_STRING: {
				FSMActionFieldSourceString fsmActionFieldSourceString = (FSMActionFieldSourceString)theEObject;
				T result = caseFSMActionFieldSourceString(fsmActionFieldSourceString);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceString);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceString);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceString);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_NUMBER: {
				FSMActionFieldSourceNumber fsmActionFieldSourceNumber = (FSMActionFieldSourceNumber)theEObject;
				T result = caseFSMActionFieldSourceNumber(fsmActionFieldSourceNumber);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceNumber);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceNumber);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceNumber);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_INTEGER: {
				FSMActionFieldSourceInteger fsmActionFieldSourceInteger = (FSMActionFieldSourceInteger)theEObject;
				T result = caseFSMActionFieldSourceInteger(fsmActionFieldSourceInteger);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceInteger);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceInteger);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceInteger);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_BOOLEAN: {
				FSMActionFieldSourceBoolean fsmActionFieldSourceBoolean = (FSMActionFieldSourceBoolean)theEObject;
				T result = caseFSMActionFieldSourceBoolean(fsmActionFieldSourceBoolean);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceBoolean);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceBoolean);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceBoolean);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_EVALUATE: {
				FSMActionFieldSourceEvaluate fsmActionFieldSourceEvaluate = (FSMActionFieldSourceEvaluate)theEObject;
				T result = caseFSMActionFieldSourceEvaluate(fsmActionFieldSourceEvaluate);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceEvaluate);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceEvaluate);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceEvaluate);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_TRANSLATE: {
				FSMActionFieldSourceTranslate fsmActionFieldSourceTranslate = (FSMActionFieldSourceTranslate)theEObject;
				T result = caseFSMActionFieldSourceTranslate(fsmActionFieldSourceTranslate);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceTranslate);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceTranslate);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceTranslate);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_REF: {
				FSMRef fsmRef = (FSMRef)theEObject;
				T result = caseFSMRef(fsmRef);
				if (result == null) result = caseFSMBase(fsmRef);
				if (result == null) result = caseFSMLazyResolver(fsmRef);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_DOT_EXPRESSION: {
				FSMDotExpression fsmDotExpression = (FSMDotExpression)theEObject;
				T result = caseFSMDotExpression(fsmDotExpression);
				if (result == null) result = caseFSMRef(fsmDotExpression);
				if (result == null) result = caseFSMBase(fsmDotExpression);
				if (result == null) result = caseFSMLazyResolver(fsmDotExpression);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_DTO_REF: {
				FSMDtoRef fsmDtoRef = (FSMDtoRef)theEObject;
				T result = caseFSMDtoRef(fsmDtoRef);
				if (result == null) result = caseFSMRef(fsmDtoRef);
				if (result == null) result = caseFSMBase(fsmDtoRef);
				if (result == null) result = caseFSMLazyResolver(fsmDtoRef);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_DTO_ATTRIBUTE: {
				FSMActionFieldSourceDtoAttribute fsmActionFieldSourceDtoAttribute = (FSMActionFieldSourceDtoAttribute)theEObject;
				T result = caseFSMActionFieldSourceDtoAttribute(fsmActionFieldSourceDtoAttribute);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceDtoAttribute);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceDtoAttribute);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceDtoAttribute);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SOURCE_EVENT: {
				FSMActionFieldSourceEvent fsmActionFieldSourceEvent = (FSMActionFieldSourceEvent)theEObject;
				T result = caseFSMActionFieldSourceEvent(fsmActionFieldSourceEvent);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldSourceEvent);
				if (result == null) result = caseFSMAction(fsmActionFieldSourceEvent);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSourceEvent);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_CONDITIONAL_TRANSITION: {
				FSMActionConditionalTransition fsmActionConditionalTransition = (FSMActionConditionalTransition)theEObject;
				T result = caseFSMActionConditionalTransition(fsmActionConditionalTransition);
				if (result == null) result = caseFSMAction(fsmActionConditionalTransition);
				if (result == null) result = caseFSMLazyResolver(fsmActionConditionalTransition);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_OPERATION_PARAMETER: {
				FSMOperationParameter fsmOperationParameter = (FSMOperationParameter)theEObject;
				T result = caseFSMOperationParameter(fsmOperationParameter);
				if (result == null) result = caseFSMAction(fsmOperationParameter);
				if (result == null) result = caseFSMLazyResolver(fsmOperationParameter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_OPERATION: {
				FSMOperation fsmOperation = (FSMOperation)theEObject;
				T result = caseFSMOperation(fsmOperation);
				if (result == null) result = caseFSMActionFieldSource(fsmOperation);
				if (result == null) result = caseFSMAction(fsmOperation);
				if (result == null) result = caseFSMLazyResolver(fsmOperation);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_GUARD: {
				FSMGuard fsmGuard = (FSMGuard)theEObject;
				T result = caseFSMGuard(fsmGuard);
				if (result == null) result = caseFSMLazyResolver(fsmGuard);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_FUNCTION: {
				FSMFunction fsmFunction = (FSMFunction)theEObject;
				T result = caseFSMFunction(fsmFunction);
				if (result == null) result = caseFSMActionFieldSource(fsmFunction);
				if (result == null) result = caseFSMAction(fsmFunction);
				if (result == null) result = caseFSMLazyResolver(fsmFunction);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_STORAGE_RETRIEVE: {
				FSMStorageRetrieve fsmStorageRetrieve = (FSMStorageRetrieve)theEObject;
				T result = caseFSMStorageRetrieve(fsmStorageRetrieve);
				if (result == null) result = caseFSMActionFieldSource(fsmStorageRetrieve);
				if (result == null) result = caseFSMAction(fsmStorageRetrieve);
				if (result == null) result = caseFSMLazyResolver(fsmStorageRetrieve);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_STORAGE: {
				FSMStorage fsmStorage = (FSMStorage)theEObject;
				T result = caseFSMStorage(fsmStorage);
				if (result == null) result = caseFSMAction(fsmStorage);
				if (result == null) result = caseFSMLazyResolver(fsmStorage);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_CONCATENATION: {
				FSMActionFieldConcatenation fsmActionFieldConcatenation = (FSMActionFieldConcatenation)theEObject;
				T result = caseFSMActionFieldConcatenation(fsmActionFieldConcatenation);
				if (result == null) result = caseFSMAction(fsmActionFieldConcatenation);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldConcatenation);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_SET: {
				FSMActionFieldSet fsmActionFieldSet = (FSMActionFieldSet)theEObject;
				T result = caseFSMActionFieldSet(fsmActionFieldSet);
				if (result == null) result = caseFSMAction(fsmActionFieldSet);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldSet);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_KEYSTROKE: {
				FSMActionFieldKeystroke fsmActionFieldKeystroke = (FSMActionFieldKeystroke)theEObject;
				T result = caseFSMActionFieldKeystroke(fsmActionFieldKeystroke);
				if (result == null) result = caseFSMAction(fsmActionFieldKeystroke);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldKeystroke);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_CLEAR: {
				FSMActionFieldClear fsmActionFieldClear = (FSMActionFieldClear)theEObject;
				T result = caseFSMActionFieldClear(fsmActionFieldClear);
				if (result == null) result = caseFSMAction(fsmActionFieldClear);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldClear);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_GET: {
				FSMActionFieldGet fsmActionFieldGet = (FSMActionFieldGet)theEObject;
				T result = caseFSMActionFieldGet(fsmActionFieldGet);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldGet);
				if (result == null) result = caseFSMAction(fsmActionFieldGet);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldGet);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_FILTER_TOGGLE: {
				FSMActionFieldFilterToggle fsmActionFieldFilterToggle = (FSMActionFieldFilterToggle)theEObject;
				T result = caseFSMActionFieldFilterToggle(fsmActionFieldFilterToggle);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldFilterToggle);
				if (result == null) result = caseFSMAction(fsmActionFieldFilterToggle);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldFilterToggle);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_FIELD_REMOVE: {
				FSMActionFieldRemove fsmActionFieldRemove = (FSMActionFieldRemove)theEObject;
				T result = caseFSMActionFieldRemove(fsmActionFieldRemove);
				if (result == null) result = caseFSMActionFieldSource(fsmActionFieldRemove);
				if (result == null) result = caseFSMAction(fsmActionFieldRemove);
				if (result == null) result = caseFSMLazyResolver(fsmActionFieldRemove);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_ITEM_VISIBLE: {
				FSMActionItemVisible fsmActionItemVisible = (FSMActionItemVisible)theEObject;
				T result = caseFSMActionItemVisible(fsmActionItemVisible);
				if (result == null) result = caseFSMAction(fsmActionItemVisible);
				if (result == null) result = caseFSMLazyResolver(fsmActionItemVisible);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_ITEM_INVISIBLE: {
				FSMActionItemInvisible fsmActionItemInvisible = (FSMActionItemInvisible)theEObject;
				T result = caseFSMActionItemInvisible(fsmActionItemInvisible);
				if (result == null) result = caseFSMAction(fsmActionItemInvisible);
				if (result == null) result = caseFSMLazyResolver(fsmActionItemInvisible);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_BUTTON_CAPTION: {
				FSMActionButtonCaption fsmActionButtonCaption = (FSMActionButtonCaption)theEObject;
				T result = caseFSMActionButtonCaption(fsmActionButtonCaption);
				if (result == null) result = caseFSMAction(fsmActionButtonCaption);
				if (result == null) result = caseFSMLazyResolver(fsmActionButtonCaption);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_BUTTON_IMAGE: {
				FSMActionButtonImage fsmActionButtonImage = (FSMActionButtonImage)theEObject;
				T result = caseFSMActionButtonImage(fsmActionButtonImage);
				if (result == null) result = caseFSMAction(fsmActionButtonImage);
				if (result == null) result = caseFSMLazyResolver(fsmActionButtonImage);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_DTO_FIND: {
				FSMActionDTOFind fsmActionDTOFind = (FSMActionDTOFind)theEObject;
				T result = caseFSMActionDTOFind(fsmActionDTOFind);
				if (result == null) result = caseFSMAction(fsmActionDTOFind);
				if (result == null) result = caseFSMLazyResolver(fsmActionDTOFind);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_DTO_CLEAR: {
				FSMActionDTOClear fsmActionDTOClear = (FSMActionDTOClear)theEObject;
				T result = caseFSMActionDTOClear(fsmActionDTOClear);
				if (result == null) result = caseFSMAction(fsmActionDTOClear);
				if (result == null) result = caseFSMLazyResolver(fsmActionDTOClear);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ACTION_SCHEDULER: {
				FSMActionScheduler fsmActionScheduler = (FSMActionScheduler)theEObject;
				T result = caseFSMActionScheduler(fsmActionScheduler);
				if (result == null) result = caseFSMAction(fsmActionScheduler);
				if (result == null) result = caseFSMLazyResolver(fsmActionScheduler);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSMDTO_TYPE: {
				FSMDTOType fsmdtoType = (FSMDTOType)theEObject;
				T result = caseFSMDTOType(fsmdtoType);
				if (result == null) result = caseFSMLazyResolver(fsmdtoType);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_FIELD_TYPE: {
				FSMFieldType fsmFieldType = (FSMFieldType)theEObject;
				T result = caseFSMFieldType(fsmFieldType);
				if (result == null) result = caseFSMLazyResolver(fsmFieldType);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_ABSTRACT_FILTER: {
				FSMAbstractFilter fsmAbstractFilter = (FSMAbstractFilter)theEObject;
				T result = caseFSMAbstractFilter(fsmAbstractFilter);
				if (result == null) result = caseFSMLazyResolver(fsmAbstractFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_FILTER_PROPERTY: {
				FSMFilterProperty fsmFilterProperty = (FSMFilterProperty)theEObject;
				T result = caseFSMFilterProperty(fsmFilterProperty);
				if (result == null) result = caseFSMLazyResolver(fsmFilterProperty);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_FILTER: {
				FSMFilter fsmFilter = (FSMFilter)theEObject;
				T result = caseFSMFilter(fsmFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_JUNCTION_FILTER: {
				FSMJunctionFilter fsmJunctionFilter = (FSMJunctionFilter)theEObject;
				T result = caseFSMJunctionFilter(fsmJunctionFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmJunctionFilter);
				if (result == null) result = caseFSMLazyResolver(fsmJunctionFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_AND_FILTER: {
				FSMAndFilter fsmAndFilter = (FSMAndFilter)theEObject;
				T result = caseFSMAndFilter(fsmAndFilter);
				if (result == null) result = caseFSMJunctionFilter(fsmAndFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmAndFilter);
				if (result == null) result = caseFSMLazyResolver(fsmAndFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_OR_FILTER: {
				FSMOrFilter fsmOrFilter = (FSMOrFilter)theEObject;
				T result = caseFSMOrFilter(fsmOrFilter);
				if (result == null) result = caseFSMJunctionFilter(fsmOrFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmOrFilter);
				if (result == null) result = caseFSMLazyResolver(fsmOrFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_BETWEEN_FILTER: {
				FSMBetweenFilter fsmBetweenFilter = (FSMBetweenFilter)theEObject;
				T result = caseFSMBetweenFilter(fsmBetweenFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmBetweenFilter);
				if (result == null) result = caseFSMLazyResolver(fsmBetweenFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_COMPARE_FILTER: {
				FSMCompareFilter fsmCompareFilter = (FSMCompareFilter)theEObject;
				T result = caseFSMCompareFilter(fsmCompareFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmCompareFilter);
				if (result == null) result = caseFSMLazyResolver(fsmCompareFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_IS_NULL_FILTER: {
				FSMIsNullFilter fsmIsNullFilter = (FSMIsNullFilter)theEObject;
				T result = caseFSMIsNullFilter(fsmIsNullFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmIsNullFilter);
				if (result == null) result = caseFSMLazyResolver(fsmIsNullFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_LIKE_FILTER: {
				FSMLikeFilter fsmLikeFilter = (FSMLikeFilter)theEObject;
				T result = caseFSMLikeFilter(fsmLikeFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmLikeFilter);
				if (result == null) result = caseFSMLazyResolver(fsmLikeFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_NOT_FILTER: {
				FSMNotFilter fsmNotFilter = (FSMNotFilter)theEObject;
				T result = caseFSMNotFilter(fsmNotFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmNotFilter);
				if (result == null) result = caseFSMLazyResolver(fsmNotFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_STRING_FILTER: {
				FSMStringFilter fsmStringFilter = (FSMStringFilter)theEObject;
				T result = caseFSMStringFilter(fsmStringFilter);
				if (result == null) result = caseFSMAbstractFilter(fsmStringFilter);
				if (result == null) result = caseFSMLazyResolver(fsmStringFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			case StatemachineDSLPackage.FSM_CONTROL_FILTER: {
				FSMControlFilter fsmControlFilter = (FSMControlFilter)theEObject;
				T result = caseFSMControlFilter(fsmControlFilter);
				if (result == null) result = caseFSMBase(fsmControlFilter);
				if (result == null) result = caseFSMLazyResolver(fsmControlFilter);
				if (result == null) result = defaultCase(theEObject);
				return result;
			}
			default: return defaultCase(theEObject);
		}
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Model</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Model</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMModel(FSMModel object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Lazy Resolver</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Lazy Resolver</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMLazyResolver(FSMLazyResolver object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Base</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Base</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMBase(FSMBase object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Package</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Package</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPackage(FSMPackage object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSM(FSM object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControl(FSMControl object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButton(FSMControlButton object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Field</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Field</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlField(FSMControlField object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control DTO</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control DTO</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlDTO(FSMControlDTO object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Scheduler</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Scheduler</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlScheduler(FSMControlScheduler object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Peripheral</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Peripheral</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlPeripheral(FSMControlPeripheral object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button Attribute</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButtonAttribute(FSMControlButtonAttribute object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButtonAttributeEvent(FSMControlButtonAttributeEvent object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Keyboard</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Keyboard</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButtonAttributeEventKeyboard(FSMControlButtonAttributeEventKeyboard object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Identity</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Identity</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButtonAttributeEventIdentity(FSMControlButtonAttributeEventIdentity object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Event</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Button Attribute Event Event</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlButtonAttributeEventEvent(FSMControlButtonAttributeEventEvent object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Visibility</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Visibility</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlVisibility(FSMControlVisibility object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Field Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Field Attribute</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlFieldAttribute(FSMControlFieldAttribute object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Field Layout</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Field Layout</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlFieldLayout(FSMControlFieldLayout object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control DTO Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control DTO Attribute</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlDTOAttribute(FSMControlDTOAttribute object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDevice(FSMPeripheralDevice object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device Display</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device Display</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDeviceDisplay(FSMPeripheralDeviceDisplay object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device Line Display</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device Line Display</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDeviceLineDisplay(FSMPeripheralDeviceLineDisplay object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device POS Printer</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device POS Printer</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDevicePOSPrinter(FSMPeripheralDevicePOSPrinter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device Cash Drawer</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device Cash Drawer</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDeviceCashDrawer(FSMPeripheralDeviceCashDrawer object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device PT</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device PT</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDevicePT(FSMPeripheralDevicePT object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Peripheral Device Signature</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Peripheral Device Signature</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMPeripheralDeviceSignature(FSMPeripheralDeviceSignature object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Scheduler Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Scheduler Attribute</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlSchedulerAttribute(FSMControlSchedulerAttribute object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Event</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Event</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMEvent(FSMEvent object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM State</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM State</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMState(FSMState object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Trigger</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Trigger</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMTrigger(FSMTrigger object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMAction(FSMAction object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Blink Rate</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Blink Rate</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralBlinkRate(FSMActionPeripheralBlinkRate object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Clear</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Clear</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralClear(FSMActionPeripheralClear object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Create Window</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Create Window</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralCreateWindow(FSMActionPeripheralCreateWindow object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Cursor Type</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Cursor Type</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralCursorType(FSMActionPeripheralCursorType object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Destroy Window</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Destroy Window</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralDestroyWindow(FSMActionPeripheralDestroyWindow object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Device Brightness</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Device Brightness</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralDeviceBrightness(FSMActionPeripheralDeviceBrightness object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Show Bitmap</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Show Bitmap</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralShowBitmap(FSMActionPeripheralShowBitmap object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Text</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Text</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralDisplayText(FSMActionPeripheralDisplayText object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Line Display Text</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Line Display Text</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralLineDisplayText(FSMActionPeripheralLineDisplayText object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Line Display Text At</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Line Display Text At</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralLineDisplayTextAt(FSMActionPeripheralLineDisplayTextAt object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Inter Character Wait</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Inter Character Wait</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralInterCharacterWait(FSMActionPeripheralInterCharacterWait object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Format</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Format</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralMarqueeFormat(FSMActionPeripheralMarqueeFormat object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Repeat Wait</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Repeat Wait</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralMarqueeRepeatWait(FSMActionPeripheralMarqueeRepeatWait object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Type</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Type</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralMarqueeType(FSMActionPeripheralMarqueeType object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Unit Wait</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Marquee Unit Wait</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralMarqueeUnitWait(FSMActionPeripheralMarqueeUnitWait object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Scroll</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Scroll</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralScroll(FSMActionPeripheralScroll object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Open Drawer</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Open Drawer</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralOpenDrawer(FSMActionPeripheralOpenDrawer object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Barcode</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Barcode</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintBarcode(FSMActionPeripheralPrintBarcode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Bitmap</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Bitmap</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintBitmap(FSMActionPeripheralPrintBitmap object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Bitmap</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Bitmap</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralDisplayBitmap(FSMActionPeripheralDisplayBitmap object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Cut</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Cut</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintCut(FSMActionPeripheralPrintCut object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Register Bitmap</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Register Bitmap</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintRegisterBitmap(FSMActionPeripheralPrintRegisterBitmap object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Register Bitmap</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Display Register Bitmap</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralDisplayRegisterBitmap(FSMActionPeripheralDisplayRegisterBitmap object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Normal</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Normal</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintNormal(FSMActionPeripheralPrintNormal object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Open</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Open</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTOpen(FSMActionPeripheralPTOpen object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Close</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Close</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTClose(FSMActionPeripheralPTClose object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Reversal</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Reversal</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTReversal(FSMActionPeripheralPTReversal object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Acknowledge</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Acknowledge</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTAcknowledge(FSMActionPeripheralPTAcknowledge object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Registration</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Registration</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTRegistration(FSMActionPeripheralPTRegistration object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Authorization</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Authorization</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTAuthorization(FSMActionPeripheralPTAuthorization object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Beeper</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Beeper</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralBeeper(FSMActionPeripheralBeeper object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Player</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Player</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPlayer(FSMActionPeripheralPlayer object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Sound</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Sound</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSound(FSMActionPeripheralSound object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Response</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral PT Response</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPTResponse(FSMActionPeripheralPTResponse object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Report</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Print Report</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralPrintReport(FSMActionPeripheralPrintReport object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Open</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Open</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureOpen(FSMActionPeripheralSignatureOpen object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Close</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Close</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureClose(FSMActionPeripheralSignatureClose object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Clear</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Clear</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureClear(FSMActionPeripheralSignatureClear object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Capture</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Capture</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureCapture(FSMActionPeripheralSignatureCapture object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Idle</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Idle</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureIdle(FSMActionPeripheralSignatureIdle object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Label</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Peripheral Signature Label</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionPeripheralSignatureLabel(FSMActionPeripheralSignatureLabel object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Signature Retrieve</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Signature Retrieve</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMSignatureRetrieve(FSMSignatureRetrieve object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSource(FSMActionFieldSource object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source String</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source String</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceString(FSMActionFieldSourceString object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Number</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Number</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceNumber(FSMActionFieldSourceNumber object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Integer</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Integer</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceInteger(FSMActionFieldSourceInteger object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Boolean</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Boolean</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceBoolean(FSMActionFieldSourceBoolean object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Evaluate</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Evaluate</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceEvaluate(FSMActionFieldSourceEvaluate object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Translate</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Translate</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceTranslate(FSMActionFieldSourceTranslate object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Ref</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Ref</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMRef(FSMRef object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Dot Expression</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Dot Expression</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMDotExpression(FSMDotExpression object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Dto Ref</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Dto Ref</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMDtoRef(FSMDtoRef object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Dto Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Dto Attribute</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceDtoAttribute(FSMActionFieldSourceDtoAttribute object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Source Event</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Source Event</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSourceEvent(FSMActionFieldSourceEvent object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Conditional Transition</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Conditional Transition</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionConditionalTransition(FSMActionConditionalTransition object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Operation Parameter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Operation Parameter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMOperationParameter(FSMOperationParameter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Operation</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Operation</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMOperation(FSMOperation object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Guard</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Guard</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMGuard(FSMGuard object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Function</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Function</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMFunction(FSMFunction object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Storage Retrieve</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Storage Retrieve</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMStorageRetrieve(FSMStorageRetrieve object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Storage</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Storage</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMStorage(FSMStorage object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Concatenation</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Concatenation</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldConcatenation(FSMActionFieldConcatenation object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Set</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Set</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldSet(FSMActionFieldSet object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Keystroke</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Keystroke</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldKeystroke(FSMActionFieldKeystroke object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Clear</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Clear</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldClear(FSMActionFieldClear object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Get</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Get</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldGet(FSMActionFieldGet object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Filter Toggle</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Filter Toggle</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldFilterToggle(FSMActionFieldFilterToggle object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Field Remove</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Field Remove</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionFieldRemove(FSMActionFieldRemove object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Item Visible</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Item Visible</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionItemVisible(FSMActionItemVisible object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Item Invisible</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Item Invisible</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionItemInvisible(FSMActionItemInvisible object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Button Caption</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Button Caption</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionButtonCaption(FSMActionButtonCaption object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Button Image</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Button Image</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionButtonImage(FSMActionButtonImage object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action DTO Find</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action DTO Find</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionDTOFind(FSMActionDTOFind object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action DTO Clear</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action DTO Clear</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionDTOClear(FSMActionDTOClear object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Action Scheduler</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Action Scheduler</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMActionScheduler(FSMActionScheduler object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSMDTO Type</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSMDTO Type</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMDTOType(FSMDTOType object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Field Type</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Field Type</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMFieldType(FSMFieldType object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Abstract Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Abstract Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMAbstractFilter(FSMAbstractFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Filter Property</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Filter Property</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMFilterProperty(FSMFilterProperty object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMFilter(FSMFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Junction Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Junction Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMJunctionFilter(FSMJunctionFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM And Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM And Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMAndFilter(FSMAndFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Or Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Or Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMOrFilter(FSMOrFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Between Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Between Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMBetweenFilter(FSMBetweenFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Compare Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Compare Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMCompareFilter(FSMCompareFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Is Null Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Is Null Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMIsNullFilter(FSMIsNullFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Like Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Like Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMLikeFilter(FSMLikeFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Not Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Not Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMNotFilter(FSMNotFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM String Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM String Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMStringFilter(FSMStringFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>FSM Control Filter</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>FSM Control Filter</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseFSMControlFilter(FSMControlFilter object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>LLazy Resolver</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>LLazy Resolver</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseLLazyResolver(LLazyResolver object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>LPackage</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>LPackage</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseLPackage(LPackage object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
	 * <!-- begin-user-doc -->
	 * This implementation returns null;
	 * returning a non-null result will terminate the switch, but this is the last case anyway.
	 * <!-- end-user-doc -->
	 * @param object the target of the switch.
	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
	 * @generated
	 */
	@Override
	public T defaultCase(EObject object) {
		return null;
	}

} //StatemachineDSLSwitch
