/*******************************************************************************
 * Copyright (c) 2009, 2011 SAP AG and others.
 * 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
 * 
 * Contributors:
 *     SAP AG - initial API and implementation
 ******************************************************************************
 * $Id: AnonymousFunctionExprImpl.java,v 1.2 2011/03/05 21:52:04 auhl Exp $
 */
package dataaccess.expressions.fp.impl;

import data.classes.FunctionSignatureImplementation;

import dataaccess.expressions.fp.AnonymousFunctionExpr;
import dataaccess.expressions.fp.FpPackage;

import dataaccess.expressions.impl.ExpressionImpl;

import java.lang.reflect.InvocationTargetException;

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

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EOperation;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Anonymous Function Expr</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * </p>
 *
 * @generated
 */
public class AnonymousFunctionExprImpl extends ExpressionImpl implements AnonymousFunctionExpr {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected AnonymousFunctionExprImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return FpPackage.Literals.ANONYMOUS_FUNCTION_EXPR;
	}

	/**
	 * The cached invocation delegate for the '{@link #getImplementation() <em>Get Implementation</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getImplementation()
	 * @generated
	 * @ordered
	 */
	protected static final EOperation.Internal.InvocationDelegate GET_IMPLEMENTATION__EINVOCATION_DELEGATE = ((EOperation.Internal)FpPackage.Literals.ANONYMOUS_FUNCTION_EXPR.getEOperations().get(0)).getInvocationDelegate();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionSignatureImplementation getImplementation() {
		try {
			FunctionSignatureImplementation result = (FunctionSignatureImplementation) GET_IMPLEMENTATION__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
			return result;
		}
		catch (InvocationTargetException ite) {
			throw new WrappedException(ite);
		}
	}

} //AnonymousFunctionExprImpl
