text: #!/usr/bin/env node
  var os = require('os');
  var fsx = require('fs-extra');
  var fs = require('fs');
  var path = require('path');
  var packageConfig = require('./lib/package-config');
  var haxeUrl = require('./lib/haxe-url');
  var vars = require('./lib/vars');
  var localConfig = require('./package.json');
  var Cache = require('./lib/cache');
  var TaskRunner = require('./lib/task-runner').TaskRunner;
  var ClearTask = require('./lib/clear-task').ClearTask;
  var DownloadHaxeTask = require('./lib/download-haxe-task').DownloadHaxeTask;
  var DownloadHaxelibTask = require('./lib/download-haxelib-task').DownloadHaxelibTask;
  var DownloadNekoTask = require('./lib/download-neko-task').DownloadNekoTask;
  var InstallHaxelibDependenciesTask = require('./lib/install-haxelib-dependencies-task').InstallHaxelibDependenciesTask;
  
  
  function findPackageJson() {
  	var startPath = process.cwd();
  	var ignore = 0;
  
  	var searchPath = path.join(startPath + '/..');
  	var fileFound = false;
  	var nextPath = '';
  	var numSearch = 0;
  
  	while (!fileFound) {
  		searchPath = nextPath || searchPath;
  		numSearch++;
  		if(numSearch>4){
  			return false;
  		}
  		try {
  			fs.statSync(path.join(searchPath + '/package.json'));
  			if (ignore > 0) {
  				ignore--;
  			} else {
  				fileFound = true;
  			}
  		} catch (err) {}
  
  		nextPath = path.join(searchPath + '/..');
  		if (nextPath === path.normalize('/') || nextPath === '.' || nextPath === '..') {
  			break;
  		}
  	}
  
  	if (fileFound) {
  		return {
  			read: function () {
  				return fs.readFileSync(path.join(searchPath + '/package.json'), 'utf8');
  			},
  			parse: function () {
  				return JSON.parse(fs.readFileSync(path.join(searchPath + '/package.json'), 'utf8'));
  			},
  			path: path.join(searchPath + '/package.json')
  		};
  	}
  
  	return false;
  };
  var pack = findPackageJson();
  
  function getHaxeDependencies(){
      var deps = [];
      try {
          deps = pack.parse().haxeDependencies;
      } catch (error){
        console.warn('no dependencies');
      }
      return deps;
  }
  
  function getVersion(module){
      var version = packageConfig(module);
      try {
          version = getHaxeDependencies()[module];
      } catch (error){
          console.warn('using default '+ module +' version');
      }
      if(version == undefined){
          version = localConfig.haxeDependencies[module];
      }
      return version;
  }
  
  var runner = new TaskRunner();
  
  runner.addTask(new ClearTask());
  runner.addTask(new DownloadHaxeTask(getVersion('haxe')));
  runner.addTask(new DownloadHaxelibTask(getVersion('haxelib')));
  runner.addTask(new DownloadNekoTask(getVersion('neko')));
  runner.addTask(new InstallHaxelibDependenciesTask(getHaxeDependencies()));
  
  runner.run();
  