<?php
/**
* 例外スタック
*
* PHP version 5
*
* @package    base
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class ExceptionStack 
{
	static $stack;

	/**
	 *	コンストラクタ
	 */
	private function __construct()
	{
	}

	/**
	 *	例外スタックを作成
	 */
	private static function init()
	{
		if ( !self::$stack ){
			self::$stack = new Stack();
		}
	}

	/**
	 *	スタックの先頭にある例外を取得
	 */
	public static function getHead()
	{
		self::init();

		$entry = self::$stack->getHead();

		return array( $entry->getException(), $entry->getFile(), $entry->getLine() );
	}

	/**
	 *	例外スタックが空か
	 */
	public static function isEmpty()
	{
		self::init();

		return self::$stack->isEmpty();
	}

	/**
	 *	スタックを空にする
	 */
	public static function clear()
	{
		self::init();

		self::$stack->clear();
	}

	/**
	 *	登録されている例外の総数を取得
	 */
	public static function count()
	{
		self::init();

		return self::$stack->count();
	}

	/**
	 *	スタックに例外を追加
	 */
	public static function push( Exception $e )
	{
		self::init();

		list( $file, $line ) = System::caller(1);
		$entry = new ExceptionStackEntry( $e, $file, $line );
		return self::$stack->push( $entry );
	}

	/**
	 *	スタックから例外を取り出す
	 *
	 *	@return list($exception,$file,$line) 配列（例外、ファイル名、行番号）
	 */
	public static function pop()
	{
		self::init();

		$entry = self::$stack->pop();

		return array( $entry->getException(), $entry->getFile(), $entry->getLine() );
	}

	/**
	 *	ダンプ
	 */
	public static function dump()
	{
		self::init();

		self::$stack->dump();
	}
}
return __FILE__;
