/* sbt -- Simple Build Tool
 * Copyright 2009  Mark Harrah
 */
package sbt

/** Defines a function to call as sbt exits.*/
trait trait ExitHook extends java.lang.Object with NotNullExitHook extends NotNullNotNull
{
	/** Provides a name for this hook to be used to provide feedback to the user. */
	def => Stringname: StringString
	/** Subclasses should implement this method, which is called when this hook is executed. */
	def ()UnitrunBeforeExiting(): UnitUnit
}

object object sbt.ExitHooksExitHooks
{
	/** This is a list of hooks to call when sbt is finished executing.*/
	private val scala.collection.mutable.HashSet[sbt.ExitHook]exitHooks = scala.collection.mutable.HashSet[sbt.ExitHook]new scala.collection.mutable.scala.collection.mutable.HashSet[sbt.ExitHook]HashSet[ExitHook]
	/** Adds a hook to call before sbt exits. */
	private[sbt] def (sbt.ExitHook)Unitregister(sbt.ExitHookhook: sbt.ExitHookExitHook) { => scala.collection.mutable.HashSet[sbt.ExitHook]exitHooks (sbt.ExitHook)Unit+= sbt.ExitHookhook }
	/** Removes a hook. */
	private[sbt] def (sbt.ExitHook)Unitunregister(sbt.ExitHookhook: sbt.ExitHookExitHook) { => scala.collection.mutable.HashSet[sbt.ExitHook]exitHooks (sbt.ExitHook)Unit-= sbt.ExitHookhook }
	/** Calls each registered exit hook, trapping any exceptions so that each hook is given a chance to run. */
	private[sbt] def (sbt.Logger)UnitrunExitHooks(sbt.Loggerlog: sbt.LoggerLogger)
	{
		for(((sbt.ExitHook) => Unit)Unithook <- => scala.collection.mutable.HashSet[sbt.ExitHook]exitHooks.=> List[sbt.ExitHook]toList)
		{
			try
			{
				sbt.Loggerlog.(=> String)Unitdebug(java.lang.String("Running exit hook '")"Running exit hook '" (Any)java.lang.String+ sbt.ExitHookhook.=> Stringname (Any)java.lang.String+ java.lang.String("'...")"'...")
				sbt.ExitHookhook.()UnitrunBeforeExiting()
			}
			catch
			{
				Unitcase java.lang.Throwablee =>
				{
					sbt.Loggerlog.(=> Throwable)Unittrace(java.lang.Throwablee);
					sbt.Loggerlog.(=> String)Uniterror(java.lang.String("Error running exit hook '")"Error running exit hook '" (Any)java.lang.String+ sbt.ExitHookhook.=> Stringname (Any)java.lang.String+ java.lang.String("': ")"': " (Any)java.lang.String+ java.lang.Throwablee.()java.lang.StringtoString)
				}
			}
		}
	}
}