Index: Engine.class.php
===================================================================
--- Engine.class.php	(revision 19)
+++ Engine.class.php	(revision 190)
@@ -120,9 +120,8 @@
 			 	*/
 				$oProfiler=ProfilerSimple::getInstance();
 				$iTimeId=$oProfiler->Start('InitModule',get_class($oModule));
-
-				$oModule->Init();
-				$oModule->SetInit();
+				
+				$this->InitModule($oModule);
 
 				$oProfiler->Stop($iTimeId);
 			}
@@ -146,28 +145,79 @@
 			$oProfiler->Stop($iTimeId);
 		}
 	}
+	
+	/**
+	 * Π?Π½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ
+	 * 
+	 * @param unknown_type $oModule
+	 * @param unknown_type $bHookParent
+	 */
+	protected function InitModule($oModule, $bHookParent = true){
+		$sOrigClassName = $sClassName = get_class($oModule);
+		if($this->isInit($sClassName)){
+			return;
+		}
+		$bRunHooks = false;
+		if($this->isInit('hook')){
+			$bRunHooks = true;
+			if($bHookParent){
+				while(preg_match('#^Plugin#i', $sClassName)){
+					$sParentClassName = get_parent_class($sClassName);
+					if($sParentClassName == 'Module'){
+						break;
+					}
+					$sClassName = $sParentClassName;
+				}
+			}
+		}
+		if($bRunHooks){
+			$this->Hook_Run($sClassName.'_init_start');
+		}
+		$oModule->Init();
+		$oModule->SetInit();
+		if(!isset($this->aModules[$sOrigClassName])){
+			$this->aModules[$sOrigClassName] = &$oModule;
+		}
+		if($bRunHooks || $sClassName == 'ModuleHook'){
+			$this->Hook_Run($sClassName.'_init_complete');
+		}
+	}
+	
 	/**
 	 * ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎ Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ
 	 *
-	 * @param  string $sModuleName
+	 * @param  string $sModuleClass
 	 * @param  bool $bInit - ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠ»ΠΈ Π½Π΅Ρ
 	 * @return Module
 	 */
-	public function LoadModule($sModuleName,$bInit=false) {
+	public function &LoadModule($sModuleClass,$bInit=false) {
 		$tm1=microtime(true);
 		
-		/**		 
-		 * Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ
-		 */		
-		$oModule=new $sModuleName($this);
-		if ($bInit or $sModuleName=='Cache') {
-			$oModule->Init();
-			$oModule->SetInit();
+		if (isset($this->aModules[$sModuleClass])) {
+			/**		 
+			 * ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ
+			 */		
+			//if($bInit or $sModuleClass=='ModuleCache'){
+			if ($bInit) {
+				$this->InitModule($oModule);
+			}
+			$oModule = &$this->aModules[$sModuleClass];
+		}else{
+			/**		 
+			 * Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ
+			 */		
+			$oModule=new $sModuleClass($this);
+			//if ($bInit or $sModuleClass=='ModuleCache') {
+			if ($bInit) {
+				$this->InitModule($oModule);
+			}else{
+				$this->aModules[$sModuleClass] = &$oModule;
+			}
 		}
-		$this->aModules[$sModuleName]=$oModule;
+		
 		$tm2=microtime(true);
 		$this->iTimeLoadModule+=$tm2-$tm1;
-		dump("load $sModuleName - \t\t".($tm2-$tm1)."");
+		dump("load $sModuleClass - \t\t".($tm2-$tm1)."");
 		return $oModule;
 	}
 	
@@ -362,7 +412,7 @@
 	 * @param  string $sName
 	 * @return array
 	 */
-	public function GetModule($sName) {
+	public function GetModule($sName, $bLoad = true) {
 		/**
 		 * ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠ΄ΡΠ»Ρ
 		 */
@@ -386,15 +436,43 @@
 		/**
 		 * ΠΠΎΠ΄ΡΠ²Π°ΡΡΠ΅ΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ (Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°Π»ΠΈΡΠΈΡ ΡΠ°ΠΊΠΎΠ²ΠΎΠ³ΠΎ)
 		 */
-		if(!in_array($sModuleName,array('Plugin','Hook'))) $sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
+		if(!in_array($sModuleName,array('Plugin','Hook'))){
+			$sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
+		}
 
 		if (isset($this->aModules[$sModuleClass])) {
-			$oModule=$this->aModules[$sModuleClass];
-		} else {
+			$oModule=&$this->aModules[$sModuleClass];
+		} elseif($bLoad) {
 			$oModule=$this->LoadModule($sModuleClass,true);
+		} else {
+			return;
 		}
 		
-		return array($oModule,$sModuleName,$sMethod);
+		return array(&$oModule,$sModuleName,$sMethod);
+	}
+	
+	/**
+	 * ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ
+	 * @param $sModuleName
+	 * @param $sPlugin
+	 */
+	public function isInit($sModuleName = null, $sPlugin = null){
+		if(!$sModuleName){
+			return false;
+		}
+		if(preg_match('#^(Module|Plugin)#i', $sModuleName)){
+			$sClassName = $sModuleName;
+		}else{
+			$sClassName = $sPlugin
+				? 'Plugin'.ucfirst($sPlugin).'_'.ucfirst($sModuleName)
+				: ucfirst($sModuleName)
+			;
+		}
+		$aModule = $this->GetModule($sClassName.'_x', false);
+		if($aModule){
+			return (bool) $aModule[0]->isInit();
+		}
+		return false;
 	}
 	
 	public function getStats() {

