_isIncludePathDefined = defined('COMPILER_INCLUDE_PATH'); if (defined('COMPILER_COLLECT_PATH')) { $this->_collectClasses = true; $this->_collectPath = COMPILER_COLLECT_PATH; } self::registerScope(self::$_scope); } /** * Singleton pattern implementation * * @return Varien_Autoload */ static public function instance() { if (!self::$_instance) { self::$_instance = new Varien_Autoload(); } return self::$_instance; } /** * Register SPL autoload function */ static public function register() { spl_autoload_register(array(self::instance(), 'autoload')); } /** * Load class source code * * @param string $class */ public function autoload($class) { if ($this->_collectClasses) { $this->_arrLoadedClasses[self::$_scope][] = $class; } if ($this->_isIncludePathDefined) { $classFile = $class; } else { $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class))); } $classFile.= '.php'; //echo $classFile;die(); return include $classFile; } /** * Register autoload scope * This process allow include scope file which can contain classes * definition which are used for this scope * * @param string $code scope code */ static public function registerScope($code) { self::$_scope = $code; if (defined('COMPILER_INCLUDE_PATH')) { @include_once self::SCOPE_FILE_PREFIX.$code.'.php'; } } /** * Get current autoload scope * * @return string */ static public function getScope() { return self::$_scope; } /** * Class destructor */ public function __destruct() { if ($this->_collectClasses) { $this->_saveCollectedStat(); } } /** * Save information about used classes per scope with class popularity * Class_Name:popularity * * @return Varien_Autoload */ protected function _saveCollectedStat() { if (!is_dir($this->_collectPath)) { @mkdir($this->_collectPath); @chmod($this->_collectPath, 0777); } if (!is_writeable($this->_collectPath)) { return $this; } foreach ($this->_arrLoadedClasses as $scope => $classes) { $file = $this->_collectPath.DIRECTORY_SEPARATOR.$scope.'.csv'; $data = array(); if (file_exists($file)) { $data = explode("\n", file_get_contents($file)); foreach ($data as $index => $class) { $class = explode(':', $class); $searchIndex = array_search($class[0], $classes); if ($searchIndex !== false) { $class[1]+=1; unset($classes[$searchIndex]); } $data[$index] = $class[0].':'.$class[1]; } } foreach ($classes as $class) { $data[] = $class . ':1'; } file_put_contents($file, implode("\n", $data)); } return $this; } }