<?php
/**
 * 短い説明
 * 
 * 長い説明
 * 
 * @package aowp.aspect
 */
/**
 * 短い説明
 * 
 * 長い説明
 * 
 * @package aowp.aspect
 */
final class AOWP_Ordering {

	/**
	 * Aspect.
	 */
	private static $_aspectArray = array();
	
	/**
	 * Constructor.
	 * 
	 * Not Allowed make instance.
	 */
	private function __construct()
	{
	}
	 
    public static function addAspect($aspect) 
    {
    	self::$_aspectArray[] = $aspect;
    }
    
    /**
     * @param String or AOWP_Aspect ($aspectNames)
     */
    public static function setOrder()
    {
    	$aspectArray = func_get_args();
    	for($i=0; $i<count($aspectArray); $i++) 
    	{
    		for($j=0; $j<count(self::$_aspectArray); $j++) 
    		{
    			$aspect = $aspectArray[$i];
    			if ( is_object($aspect) ) {
    				if ( get_class(self::$_aspectArray[$j])==get_class($aspectArray[$i]) )
    					self::$_aspectArray[$j]->setPrecedence(count($aspectArray)-$i);
    			} else if ( is_string($aspect) ) {
    				if ( get_class(self::$_aspectArray[$j])==$aspectArray[$i] )
    					self::$_aspectArray[$j]->setPrecedence(count($aspectArray)-$i);
    			} else 
    				throw new RuntimeException('Invalud arguments given '.get_class(self));
    		}
    	}
    }
    
    public static function sortByPrecedence()
    {
    	$n = count(self::$_aspectArray);
    	for($i=0; $i<$n-1; $i++)
    	{
      		for($j=$n-1; $j>$i; $j--)
      		{
				if( self::$_aspectArray[$j]->getPrecedence()>self::$_aspectArray[$j-1]->getPrecedence() )
				{
			  		$t=self::$_aspectArray[$j];
					self::$_aspectArray[$j]=self::$_aspectArray[$j-1];
					self::$_aspectArray[$j-1]=$t;
				}
			}
     	 }
    }
    
    public static function getAspectArray() 
    {
    	return self::$_aspectArray;
    }
}
?>
