/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
 package org.eclipse.osbp.ui.api.functionlibrary;

import java.util.Locale;

import org.eclipse.osbp.ui.api.statemachine.IStateMachine;

/**
 * This service provides access to the function library.
 */
public interface IFunctionLibraryService {

	public Object callFunctionLibrary(String className, String methodName,
			Object fieldValue, Locale locale, Object... params);

	public Object callFunctionLibrary(String className, String methodName,
			Object fieldValue);

	public Object callFunctionLibrary(String className, String methodName,
			Locale locale);

	public Object callFunctionLibrary(String className, String methodName);

	public boolean guard(IStateMachine statemachine, String className, String methodName);

	public boolean operation(IStateMachine statemachine, String className,
			String methodName, Object... params);

	public Object function(IStateMachine statemachine, String className,
			String methodName, Object... params);
}
