public function install($module, $version, $options = null)
    {
        $module = strtolower($module);
        $options = is_null($options) ? array() : $options;
        
        $modules = $this->findModules();
        $current = array();
    
        foreach($modules as $name){
            $modVersion = $this->getModuleVersion($name);
            
            if ($modVersion) {
                $current[$name] = new SoftwareVersion(
                    $this->getModuleVersion($name));
            }
        }
        
        // Resolve deps
        $deps = $this->resolveDependencies(
            $module
        );
        
        if (!$deps->offsetExists($module)) {
            $deps->offsetSet($module, $version);
        }
        
        $queue = new PriorityQueue();
        
        // Setup all dependencies
        foreach($deps as $depModule => $depVersion){
            if(!$this->hasSetupService($depModule)){
                continue;
            }
    
            $setup = $this->initSetupService($depModule);
            $queue->insert(['service' => $setup, 'module' => $depModule], $setup->getPriority());
        }
        
        foreach ($queue->getIterator() as $datum) {
            $service    = $datum['service'];
            $depModule  = $datum['module'];
            $operation  = 'setup';
            $args       = array();
        
            if ($depModule == $module) {
                $args['options'] = $options;
            }
             
            // complete existing installation
            $service->exec(
                $operation,
                $args
            );
        }
        
        return true;
    }