code: /**
   * <copyright>
   * Copyright (c) 2010-2014 Henshin developers. 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
   * </copyright>
   */
  package org.eclipse.emf.henshin.interpreter;
  
  import org.eclipse.emf.henshin.interpreter.impl.InterpreterFactoryImpl;
  import org.eclipse.emf.henshin.model.Rule;
  import org.eclipse.emf.henshin.model.Unit;
  
  /**
   * Interface for the interpreter factory.
   * 
   * @author Christian Krause
   */
  public interface InterpreterFactory {
  	
  	/**
  	 * Static factory instance.
  	 */
  	final static InterpreterFactory INSTANCE = new InterpreterFactoryImpl();
  	
  	/**
  	 * Create a new {@link EGraph} object.
  	 * @return A new {@link EGraph}.
  	 */
  	EGraph createEGraph();
  
  	/**
  	 * Create an {@link Assignment} object.
  	 * @param unit Target {@link Unit}.
  	 * @param isResultAssignment Determines whether this is a result assignment.
  	 * @return A new {@link Assignment}.
  	 */
  	Assignment createAssignment(Unit unit, boolean isResultAssignment);
  	
  	/**
  	 * Create a {@link Match}.
  	 * @param Rule to be matched.
  	 * @param isResultMatch Determines whether this is a result match.
  	 * @return A new {@link Match}.
  	 */
  	Match createMatch(Rule rule, boolean isResultMatch);
  
  	/**
  	 * Create an {@link Engine} object.
  	 * @return A new {@link Engine}.
  	 */
  	Engine createEngine();
  	
  	/**
  	 * Create a new {@link UnitApplication}.
  	 * @param engine {@link Engine} to be used.
  	 * @return A new {@link UnitApplication}.
  	 */
  	UnitApplication createUnitApplication(Engine engine);
  
  	/**
  	 * Create a new {@link RuleApplication}.
  	 * @param engine {@link Engine} to be used.
  	 * @return A new {@link RuleApplication}.
  	 */
  	RuleApplication createRuleApplication(Engine engine);
  	
  	/**
  	 * Create an {@link ApplicationMonitor}.
  	 * @return A new {@link ApplicationMonitor}.
  	 */
  	ApplicationMonitor createApplicationMonitor();
  	
  }
  