Advertisement
Guest User

Spirit main class

a guest
Oct 25th, 2010
179
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var Spirit = new Class({
  2.     Binds: ['hit', 'load'],
  3.     initialize : function (projectPath, libPath) {
  4.         this.projectPath = projectPath.trim();
  5.         this.libPath     = fs.realpathSync(libPath);
  6.         this.requirePath = this.projectPath + '/classes/';
  7.         this.spiritRequirePath = this.libPath + '/spirit/classes/';
  8.     },
  9.     // с помощью load мы будем грузить классы, например:
  10.     // spirit.load('Controllers.User');
  11.     // флаг fromSpirit позволит загружать напрямую класс фреймворка,
  12.     // игнорируя классы приложения
  13.     load : function (className, fromSpirit) {
  14.         // объект loaded - это закешированные уже загруженные классы
  15.         var lc = loaded.classes, ls = loaded.spirit, loadedClass;
  16.         if (!fromSpirit) {
  17.             if (!lc[className]) {
  18.                 // в первую очередь загружаем класс приложения и пишем его в кеш
  19.                 loadedClass = load.call(this, this.requirePath, className);
  20.                 lc[className] = loadedClass;
  21.             } else {
  22.                 // если нас устраивает класс приложения и он есть в кеше -
  23.                 // его можно просто вернуть пользователю
  24.                 return lc[className];
  25.             }
  26.         }
  27.         // если нам нужен именно класс Спирита, или в приложении
  28.         // нет такого класса - ищем его в spiritRequirePath
  29.         if ((fromSpirit || !lc[className]) && !ls[className]) {
  30.             loadedClass = load.call(this, this.spiritRequirePath, className);
  31.             ls[className] = loadedClass;
  32.         }
  33.        
  34.         // Класс - это либо такой из приложения или,
  35.         // если в приложении нету - из Спирита
  36.         var cl = (!fromSpirit && lc[className]) || ls[className];
  37.         if (!cl) {
  38.             // Ексепшены пишут в лог достаточно скудно, потому дополнительно логируем
  39.             console.log('No class «' + className + '», fromSpirit: ' + (fromSpirit?'on':'off'));
  40.             throw 'Spirit.LoadClass.Exception';
  41.         }
  42.         // Возвращаем класс, если удалось найти
  43.         return cl;
  44.     },
  45.     // Неоходимо для изящной загрузки библиотек, например:
  46.     // spirit.loadLib('mysql-libmysqlclient')
  47.     loadLib : function (libName) {
  48.         var ll = loaded.libs;
  49.         if (!ll[libName]) {
  50.             // библиотека должна находится в директории с таким же
  51.             // названием как и основной файл внутри libPath
  52.             var path = this.libPath + '/' + libName + '/' + libName;
  53.             var load = require(path);
  54.             ll[libName] = load;
  55.         }
  56.         return ll[libName];
  57.     },
  58.     // Каждый запрос будет вызван этот метод
  59.     hit : function (req, res) {
  60.         // будет рассмотрен в следующей части
  61.     },
  62.     listen : function (port, url) {
  63.         // Мы можем принять аргументы как listen(8124, '127.0.0.1')
  64.         // И как listen('127.0.0.1:8124')
  65.         if (arguments.length == 1) {
  66.             var parts = port.split(':');
  67.             port = Number(parts[1]);
  68.             url  = parts[0];
  69.         }
  70.         // this.hit записана в Binds, потому можно смело передавать как аргумент
  71.         require('http')
  72.             .createServer(this.hit)
  73.             .listen(port, url);
  74.         if (!url.test(/\:\/\//)) {
  75.             url = 'http://' + url;
  76.         }
  77.         console.log('Spirit running at ' + url + ':' + port + '/');
  78.         return this;
  79.     }
  80. });
  81.  
  82. var fs = require('fs');
  83.  
  84. var loaded = {
  85.     spirit  : {},
  86.     classes : {},
  87.     libs    : {}
  88. };
  89.  
  90. var load = function (path, className) {
  91.     // Загрузка класса - точки меняем на слеши и получаем его путь.
  92.     path += (className.replace(/\./g, '/'));
  93.     try {
  94.         var data = require(path);
  95.     } catch (e) {
  96.         return null;
  97.     }
  98.  
  99.     // Из экспорта мы вызываем функцию с именем класса
  100.     // и передаем объект Spirit. Зачем и как с ним работать?
  101.     // смотрите ниже!
  102.     return data[className](this);
  103. };
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement