Autoloader.php.bak

<?php

namespace Lia\Compo;

class Autoloader extends \Lia\Compo 
{
    protected $dirs = [];
    protected $loaders = [];

    public function onCreate(){
        spl_autoload_register([$this, 'loadClass']);
    }

    public function onReady(){
        $lia = $this->lia;

        // $lia->addApi('lia:autoload.addDir', [$this, 'autoload']);
        // $lia->addApiMethod('lia:autoload.addDir', 'autoload');

        $lia->setter('lia:autoloader.dir', 'autoload', 'arset');
        $lia->setter('lia:autoloader.loaders', 'addAutoloader', 'append');
        // $lia->getter('lia:autoloader.dir', '')


        $lia->addApi('lia:autoload.addCallback',[$this,'addAutoloader']);
        $lia->addApiMethod('lia:autoload.addCallback', 'addAutoloader');

        $lia->addApi('lia:autoload.addFromPrefixFunc', [$this, 'addAutoloaderFromPrefix']);
        $lia->addApiPrefix('lia:autoload.addFromPrefixFunc', 'autoload');
    
    }
    public function autoload($directory, $baseNamespaces=[]){
        $this->addDir($directory, ...$baseNamespaces);
    }

    public function addAutoloader($callback){
        //@TODO Consider adding check to see if autoloader is callable. Small performance hit, but better feedback to Liaison users
        $this->loaders[] = $callback;
    }

    public function addAutoloaderFromPrefix($key, $callback){
        return $this->lia->api('lia:autoload.addCallback', $callback);
    }

    public function addDir($dir,...$baseNamespaces){
        $this->dirs[$dir] = $baseNamespaces;
        // $this->lia->arset('lia:autoloader.dir', $dir, $baseNamespaces);
    }

    
    public function loadClass($class) {
        // @TODO provide a classmap style loader that doesn't require proper namespacing
        foreach ($this->loaders as $loader){
            $loader($class);
            if (class_exists($class, false))return;
        }
        foreach ($this->dirs as $dir=>$namespaces){
            $namespaces[] = '';
            foreach ($namespaces as $ns){
                //@TODO maybe improve the performance of namespace checking??
                if (substr($ns,0,1)=='\\')$ns = substr($ns,1);
                if ($ns!=''&&strpos($class,$ns)!==0)continue;
                $classPath = str_replace('\\','/',substr($class,strlen($ns))).'.php';
                if (file_exists($file = $dir.'/'.$classPath)){
                    require_once($file);
                    return;
                } else {
                    //DEBUG
                    // echo $file."\n";
                }
            }
        }
    }

}