<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Zend\Code\Scanner;

use 
Zend\Code\Annotation\AnnotationManager;
use 
Zend\Code\Exception;
use 
Zend\Code\NameInformation;

class 
CachingFileScanner extends FileScanner
{
    
/**
     * @var array
     */
    
protected static $cache = array();

    
/**
     * @var null|FileScanner
     */
    
protected $fileScanner null;

    
/**
     * @param  array|null $file
     * @param  AnnotationManager $annotationManager
     * @throws Exception\InvalidArgumentException
     */
    
public function __construct($fileAnnotationManager $annotationManager null)
    {
        if (!
file_exists($file)) {
            throw new 
Exception\InvalidArgumentException(sprintf(
                
'File "%s" not found',
                
$file
            
));
        }

        
$file realpath($file);

        
$cacheId md5($file) . '/' . ((isset($annotationManager) ? spl_object_hash($annotationManager) : 'no-annotation'));

        if (isset(static::
$cache[$cacheId])) {
            
$this->fileScanner = static::$cache[$cacheId];
        } else {
            
$this->fileScanner       = new FileScanner($file$annotationManager);
            static::
$cache[$cacheId] = $this->fileScanner;
        }
    }

    
/**
     * @return void
     */
    
public static function clearCache()
    {
        static::
$cache = array();
    }

    
/**
     * @return AnnotationManager
     */
    
public function getAnnotationManager()
    {
        return 
$this->fileScanner->getAnnotationManager();
    }

    
/**
     * @return array|null|string
     */
    
public function getFile()
    {
        return 
$this->fileScanner->getFile();
    }

    
/**
     * @return null|string
     */
    
public function getDocComment()
    {
        return 
$this->fileScanner->getDocComment();
    }

    
/**
     * @return array
     */
    
public function getNamespaces()
    {
        return 
$this->fileScanner->getNamespaces();
    }

    
/**
     * @param  null|string $namespace
     * @return array|null
     */
    
public function getUses($namespace null)
    {
        return 
$this->fileScanner->getUses($namespace);
    }

    
/**
     * @return array
     */
    
public function getIncludes()
    {
        return 
$this->fileScanner->getIncludes();
    }

    
/**
     * @return array
     */
    
public function getClassNames()
    {
        return 
$this->fileScanner->getClassNames();
    }

    
/**
     * @return array
     */
    
public function getClasses()
    {
        return 
$this->fileScanner->getClasses();
    }

    
/**
     * @param  int|string $className
     * @return ClassScanner
     */
    
public function getClass($className)
    {
        return 
$this->fileScanner->getClass($className);
    }

    
/**
     * @param  string $className
     * @return bool|null|NameInformation
     */
    
public function getClassNameInformation($className)
    {
        return 
$this->fileScanner->getClassNameInformation($className);
    }

    
/**
     * @return array
     */
    
public function getFunctionNames()
    {
        return 
$this->fileScanner->getFunctionNames();
    }

    
/**
     * @return array
     */
    
public function getFunctions()
    {
        return 
$this->fileScanner->getFunctions();
    }
}