<?php
/**
* クラスローダを生成するファクトリ・クラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
class charcoal_ClassLoaderFactory
{
	/*
	 *    クラスローダを作成
	 */
	public static function create( $class_loader_name )
	{
		log_info( "system",  "クラスローダ[$class_loader_name]を作成します。", __FILE__, __LINE__ );

		// 設定プロバイダを作成
		$provider = charcoal_ConfigProviderFactory::create();

		// 設定値格納用オブジェクトを作成
		$config= new charcoal_Config();

		// 個別設定ファイルを読み込む
		$config_name = "class_loaders/$class_loader_name.class_loader";
		$config->append( $provider->load( $config_name ) );

		// クラス名を取得
		$class_name = $config->getString( 'class_name' );

		if ( !$class_name ){
			throw new charcoal_ClassLoaderConfigException( 'class_name', 'mandatory' );
		}

		// ソースパスを取得
		$source_file = $config->getString( 'source_file' );

		if ( !$source_file ){
			throw new charcoal_ClassLoaderConfigException( 'source_file', 'mandatory' );
		}

		// ソースの取り込み
		require_once( "$source_file" );

		// クラスローダのインスタンス生成
		$classloader = charcoal_ClassUtil::newInstance( $class_name );

		// 生成したインスタンスがIClassLoaderインタフェースを実装しているか確認
		if ( !($classloader instanceof charcoal_IClassLoader) ){
			// 実装例外
			throw new charcoal_InterfaceImplementException( $class_name, "charcoal_IClassLoader" );
		}

		log_info( "system",  "クラスローダ[$class_loader_name]を作成しました。", __FILE__, __LINE__ );

		// ロードしたクラスローダを返却
		return $classloader;
	}

}
?>