SlideShare a Scribd company logo
1 of 26
Download to read offline
JavaScript - не нужен!
CoffeeScript - мимими



                   Евгений Власенко
            CoffeeScript Developer @ Noveo
                http://about.me/vlasenko
Область применения ООП в
                         JavaScript


   Объектно ориентированный подход можно
   применять везде, где задача сложнее, чем
   отправить форму на сервер по клику на
   кнопку.
                                               Евгений Власенко, 6 октября 2012




JavaScript - не нужен! CoffeeScript - мимими
JavaScript и ООП

   ● Объект в JavaScript — это просто
     коллекция пар ключ-значение
     (ассоциативные массивы, хэши)

   ● Прототипное наследование — это
     прекрасно!




JavaScript - не нужен! CoffeeScript - мимими
Object

   var Car = function(speed){
     this.speed = speed;
   }

   var fast = new Car(180);
   var slow = new Car(20);

   console.log(fast, slow); //{ speed: 180 } { speed: 20 }




JavaScript - не нужен! CoffeeScript - мимими
Методы объекта
      экономия памяти - не, не слышал
   var Car = function(speed){
     this.speed = speed;
     // Метод лежит в каждом экземпляре
     this.printSpeed = function(){
       console.log(this.speed + ' км/ч')
     }
   }

   var fast = new Car(180);
   var slow = new Car(20);

   fast.printSpeed(); // 180 км/ч
   slow.printSpeed(); // 20 км/ч

JavaScript - не нужен! CoffeeScript - мимими
Методы объекта

   var Car = function(speed){
     this.speed = speed;
   }
   // Метод в прототипе в единственном экземпляре - профит
   Car.prototype.printSpeed = function(){
     console.log(this.speed + ' км/ч');
   }

   var fast = new Car(180);
   var slow = new Car(20);

   fast.printSpeed(); // 180 км/ч
   slow.printSpeed(); // 20 км/ч

JavaScript - не нужен! CoffeeScript - мимими
Выстрел в ногу
   function Hamster() { }
   Hamster.prototype = {
         food: [],
         found: function(something) {
               this.food.push(something);
         }
   }
   speedy = new Hamster();
   lazy = new Hamster();

   speedy.found("apple");
   speedy.found("orange");

   console.log(speedy.food); // [ 'apple', 'orange' ]
   console.log(lazy.food); // [ 'apple', 'orange' ]




JavaScript - не нужен! CoffeeScript - мимими
Выстрел в ногу
   function Hamster() { }
   Hamster.prototype = {
         food: [],
         // при чтении, свойство ищется в цепочке прототипов
         found: function(something) {
               this.food.push(something);
         }
   }
   speedy = new Hamster();
   lazy = new Hamster();

   speedy.found("apple");
   speedy.found("orange");

   console.log(speedy.food); // [ 'apple', 'orange' ]
   console.log(lazy.food); // [ 'apple', 'orange' ]




JavaScript - не нужен! CoffeeScript - мимими
И волки целы, и овцы сыты
   function Hamster() {
      this.food = [ ];
   }
   Hamster.prototype = {
          found: function(something) {
                this.food.push(something);
          }
   }
   speedy = new Hamster();
   lazy = new Hamster();

   speedy.found("apple");
   speedy.found("orange");

   console.log(speedy.food); // [ 'apple', 'orange' ]
   console.log(lazy.food); // [ ]




JavaScript - не нужен! CoffeeScript - мимими
Прототипное наследование

   var Car = function(speed){
     this.speed = speed;
   }
   var BMW = function(series){
     this.series = series;
   }
   BMW.prototype = new Car(180);




JavaScript - не нужен! CoffeeScript - мимими
Прототипное наследование

   var Car = function(speed){
     this.speed = speed;
   }
   var BMW = function(series){
     this.series = series;
   }
   BMW.prototype = new Car(180);

   Мы испортили всё, что можно!
   ● Прототип BMW.prototype
   ● Конструктор BMW.prototype.constructor
   ● В любой момент можем выстрелить в ногу
   Можно раскидывать ручками при каждом наследовании, но...

JavaScript - не нужен! CoffeeScript - мимими
Прототипное наследование

   var extend = function(Child, Parent) {
     var F = function() { }
     F.prototype = Parent.prototype
     Child.prototype = new F()
     Child.prototype.constructor = Child
     Child.superclass = Parent.prototype
   }


   Всё хорошо, за исключением случая с
   "хомяком" и "разделяемой" едой.


JavaScript - не нужен! CoffeeScript - мимими
Прототипное наследование — это
               прекрасно!
   var extend = function (child, parent) {
     for (var key in parent) {
       if ({}.hasOwnProperty.call(parent, key)) child[key] = parent[key];
     }
     function ctor() {
       this.constructor = child;
     }
     ctor.prototype = parent.prototype;
     child.prototype = new ctor();
     child.__super__ = parent.prototype;
     return child;
   }


JavaScript - не нужен! CoffeeScript - мимими
Реклама CoffeeScript

  1. CoffeeScript - это меньше букав
  2. Разделение блоков кода отступами
  3. Ещё куча вкусностей и приятностей


                 http://coffeescript.org/


JavaScript - не нужен! CoffeeScript - мимими
CoffeeScript и ООП

   CoffeeScript делает за Вас всё, что было
   сказано выше про JavaScript и ООП.




JavaScript - не нужен! CoffeeScript - мимими
Классы в CoffeeScript

   class Drink                                 var Drink = (function() {
    constructor: (volume)->                      function Drink(volume) {
      @volume = volume                             this.volume = volume;
    printVolume: ()->                            }
      console.log(@volume + ' л.')               Drink.prototype.printVolume = function(){
                                                     return console.log(this.volume + '
                                               л.');
                                                 };
                                                 return Drink;
                                               })();




JavaScript - не нужен! CoffeeScript - мимими
Наследование в CoffeeScript
                                               var Beer, Drink,
                                                __hasProp = {}.hasOwnProperty,
                                                __extends = function(child, parent) { for (var key in parent) { if (__hasProp.ca
   class Drink                                 function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; chi
                                               parent.prototype; return child; };
    constructor: (volume)->                    Drink = (function() {
      @volume = volume                          function Drink(volume) {
                                                    this.volume = volume;
    printVolume: ()->                           }

      console.log(@volume+' л.')                Drink.prototype.printVolume = function() {
                                                    return console.log(this.volume + ' л.');
                                                };
                                                return Drink;
   class Beer extends Drink                    })();
    constructor: (volume, alcohol)->           Beer = (function(_super) {
                                                __extends(Beer, _super);
      super(volume)                             function Beer(volume, alcohol) {
      @alcohol = alcohol                            Beer.__super__.constructor.call(this, volume);
                                                    this.alcohol = alcohol;
    printAlcohol: ()->                          }
                                                Beer.prototype.printAlcohol = function() {
      console.log(@alcohol+' %')
                                                    return console.log(this.alcohol + ' %');
                                                };
                                                return Beer;
                                               })(Drink);



JavaScript - не нужен! CoffeeScript - мимими
Киллер фича CoffeeScript

   ● В официальной документации о работе с
     классами написано очень мало
   ● Реализация ООП подхода в CoffeeScript
     очень простая и прозрачная
     Я считаю, именно это является киллер
   фичей этого языка




JavaScript - не нужен! CoffeeScript - мимими
Вкусности CoffeeScript




JavaScript - не нужен! CoffeeScript - мимими
Статический метод

   class Drink                                 var Drink = (function() {
    constructor: (volume)->                      function Drink(volume) {
      @volume = volume                             this.volume = volume;
    printVolume: ()->                            }
      console.log(@volume+' л.')                 Drink.prototype.printVolume = function()
    @format: (name)->                          {
      'Drink '+name                                return console.log(this.volume + ' л.');
                                                 };
                                                 Drink.format = function(name) {
                                                   return 'Drink ' + name;
                                                 };
                                                 return Drink;
                                               })();



JavaScript - не нужен! CoffeeScript - мимими
Забиндим метод на объекте

   class Drink                                 class Drink
    constructor: (volume)->                     constructor: (volume)->
      @volume = volume                            @volume = volume
    printVolume: ()=>                           printVolume: ()->
      console.log(@volume+' л.')                  console.log(@volume+' л.')

   drink = new Drink(5)                        drink = new Drink(5)
   setTimeout(drink.printVolume, 5000)         setTimeout(drink.printVolume, 5000)
   // undefined л.                             // 5 л.




JavaScript - не нужен! CoffeeScript - мимими
Забиндим метод на объекте
                      Взгляд изнутри
   Используется такая связка:

   __bind = function(fn, me){ return function(){ return fn.apply
   (me, arguments); }; };
   this.printVolume = __bind(this.printVolume, this);

   Можно писать самим, но зачем, когда это может
   сделать CoffeeScript.




JavaScript - не нужен! CoffeeScript - мимими
Меньше буков

   class Drink                                       var Drink;
    constructor: (@volume)->                         Drink = (function() {
                                                       function Drink(volume) {
                                                         this.volume = volume;
                                                       }
                                                       return Drink;
                                                     })();




JavaScript - не нужен! CoffeeScript - мимими
Сахар - параметры по умолчанию

   class Drink                                 var Drink;
    constructor: (@volume=0.5)->               Drink = (function() {
                                                 function Drink(volume) {
                                                   this.volume = volume != null ?
                                               volume : 0.5;
                                                 }
                                                 return Drink;
                                               })();




JavaScript - не нужен! CoffeeScript - мимими
Хотелось бы упомянуть

  1. Cake - система сборки CoffeeScript
  2. NodeJS - просто NodeJS
  3. Презентация о coffeescript с котятками
  4. JavaScript-Garden - документация по
     самым заковыристым темам языка
     JavaScript
  5. browserify - тулза для использования
     require на клиенте


JavaScript - не нужен! CoffeeScript - мимими
Спасибо за внимание




                 Евгений Власенко
          CoffeeScript Developer @ Noveo
              http://about.me/vlasenko

More Related Content

Similar to JavaScript не нужен, CoffeeScript - мимими

TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalAndrei Solntsev
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitAndrey Sitnik
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаIlya Chesnokov
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 

Similar to JavaScript не нужен, CoffeeScript - мимими (20)

TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - final
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
бегун
бегунбегун
бегун
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
BDD для PHP проектов
BDD для PHP проектовBDD для PHP проектов
BDD для PHP проектов
 
бегун
бегунбегун
бегун
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Chef
ChefChef
Chef
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Парсер: что? зачем? как?
Парсер: что? зачем? как?Парсер: что? зачем? как?
Парсер: что? зачем? как?
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 

JavaScript не нужен, CoffeeScript - мимими

  • 1. JavaScript - не нужен! CoffeeScript - мимими Евгений Власенко CoffeeScript Developer @ Noveo http://about.me/vlasenko
  • 2. Область применения ООП в JavaScript Объектно ориентированный подход можно применять везде, где задача сложнее, чем отправить форму на сервер по клику на кнопку. Евгений Власенко, 6 октября 2012 JavaScript - не нужен! CoffeeScript - мимими
  • 3. JavaScript и ООП ● Объект в JavaScript — это просто коллекция пар ключ-значение (ассоциативные массивы, хэши) ● Прототипное наследование — это прекрасно! JavaScript - не нужен! CoffeeScript - мимими
  • 4. Object var Car = function(speed){ this.speed = speed; } var fast = new Car(180); var slow = new Car(20); console.log(fast, slow); //{ speed: 180 } { speed: 20 } JavaScript - не нужен! CoffeeScript - мимими
  • 5. Методы объекта экономия памяти - не, не слышал var Car = function(speed){ this.speed = speed; // Метод лежит в каждом экземпляре this.printSpeed = function(){ console.log(this.speed + ' км/ч') } } var fast = new Car(180); var slow = new Car(20); fast.printSpeed(); // 180 км/ч slow.printSpeed(); // 20 км/ч JavaScript - не нужен! CoffeeScript - мимими
  • 6. Методы объекта var Car = function(speed){ this.speed = speed; } // Метод в прототипе в единственном экземпляре - профит Car.prototype.printSpeed = function(){ console.log(this.speed + ' км/ч'); } var fast = new Car(180); var slow = new Car(20); fast.printSpeed(); // 180 км/ч slow.printSpeed(); // 20 км/ч JavaScript - не нужен! CoffeeScript - мимими
  • 7. Выстрел в ногу function Hamster() { } Hamster.prototype = { food: [], found: function(something) { this.food.push(something); } } speedy = new Hamster(); lazy = new Hamster(); speedy.found("apple"); speedy.found("orange"); console.log(speedy.food); // [ 'apple', 'orange' ] console.log(lazy.food); // [ 'apple', 'orange' ] JavaScript - не нужен! CoffeeScript - мимими
  • 8. Выстрел в ногу function Hamster() { } Hamster.prototype = { food: [], // при чтении, свойство ищется в цепочке прототипов found: function(something) { this.food.push(something); } } speedy = new Hamster(); lazy = new Hamster(); speedy.found("apple"); speedy.found("orange"); console.log(speedy.food); // [ 'apple', 'orange' ] console.log(lazy.food); // [ 'apple', 'orange' ] JavaScript - не нужен! CoffeeScript - мимими
  • 9. И волки целы, и овцы сыты function Hamster() { this.food = [ ]; } Hamster.prototype = { found: function(something) { this.food.push(something); } } speedy = new Hamster(); lazy = new Hamster(); speedy.found("apple"); speedy.found("orange"); console.log(speedy.food); // [ 'apple', 'orange' ] console.log(lazy.food); // [ ] JavaScript - не нужен! CoffeeScript - мимими
  • 10. Прототипное наследование var Car = function(speed){ this.speed = speed; } var BMW = function(series){ this.series = series; } BMW.prototype = new Car(180); JavaScript - не нужен! CoffeeScript - мимими
  • 11. Прототипное наследование var Car = function(speed){ this.speed = speed; } var BMW = function(series){ this.series = series; } BMW.prototype = new Car(180); Мы испортили всё, что можно! ● Прототип BMW.prototype ● Конструктор BMW.prototype.constructor ● В любой момент можем выстрелить в ногу Можно раскидывать ручками при каждом наследовании, но... JavaScript - не нужен! CoffeeScript - мимими
  • 12. Прототипное наследование var extend = function(Child, Parent) { var F = function() { } F.prototype = Parent.prototype Child.prototype = new F() Child.prototype.constructor = Child Child.superclass = Parent.prototype } Всё хорошо, за исключением случая с "хомяком" и "разделяемой" едой. JavaScript - не нужен! CoffeeScript - мимими
  • 13. Прототипное наследование — это прекрасно! var extend = function (child, parent) { for (var key in parent) { if ({}.hasOwnProperty.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; } JavaScript - не нужен! CoffeeScript - мимими
  • 14. Реклама CoffeeScript 1. CoffeeScript - это меньше букав 2. Разделение блоков кода отступами 3. Ещё куча вкусностей и приятностей http://coffeescript.org/ JavaScript - не нужен! CoffeeScript - мимими
  • 15. CoffeeScript и ООП CoffeeScript делает за Вас всё, что было сказано выше про JavaScript и ООП. JavaScript - не нужен! CoffeeScript - мимими
  • 16. Классы в CoffeeScript class Drink var Drink = (function() { constructor: (volume)-> function Drink(volume) { @volume = volume this.volume = volume; printVolume: ()-> } console.log(@volume + ' л.') Drink.prototype.printVolume = function(){ return console.log(this.volume + ' л.'); }; return Drink; })(); JavaScript - не нужен! CoffeeScript - мимими
  • 17. Наследование в CoffeeScript var Beer, Drink, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.ca class Drink function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; chi parent.prototype; return child; }; constructor: (volume)-> Drink = (function() { @volume = volume function Drink(volume) { this.volume = volume; printVolume: ()-> } console.log(@volume+' л.') Drink.prototype.printVolume = function() { return console.log(this.volume + ' л.'); }; return Drink; class Beer extends Drink })(); constructor: (volume, alcohol)-> Beer = (function(_super) { __extends(Beer, _super); super(volume) function Beer(volume, alcohol) { @alcohol = alcohol Beer.__super__.constructor.call(this, volume); this.alcohol = alcohol; printAlcohol: ()-> } Beer.prototype.printAlcohol = function() { console.log(@alcohol+' %') return console.log(this.alcohol + ' %'); }; return Beer; })(Drink); JavaScript - не нужен! CoffeeScript - мимими
  • 18. Киллер фича CoffeeScript ● В официальной документации о работе с классами написано очень мало ● Реализация ООП подхода в CoffeeScript очень простая и прозрачная Я считаю, именно это является киллер фичей этого языка JavaScript - не нужен! CoffeeScript - мимими
  • 19. Вкусности CoffeeScript JavaScript - не нужен! CoffeeScript - мимими
  • 20. Статический метод class Drink var Drink = (function() { constructor: (volume)-> function Drink(volume) { @volume = volume this.volume = volume; printVolume: ()-> } console.log(@volume+' л.') Drink.prototype.printVolume = function() @format: (name)-> { 'Drink '+name return console.log(this.volume + ' л.'); }; Drink.format = function(name) { return 'Drink ' + name; }; return Drink; })(); JavaScript - не нужен! CoffeeScript - мимими
  • 21. Забиндим метод на объекте class Drink class Drink constructor: (volume)-> constructor: (volume)-> @volume = volume @volume = volume printVolume: ()=> printVolume: ()-> console.log(@volume+' л.') console.log(@volume+' л.') drink = new Drink(5) drink = new Drink(5) setTimeout(drink.printVolume, 5000) setTimeout(drink.printVolume, 5000) // undefined л. // 5 л. JavaScript - не нужен! CoffeeScript - мимими
  • 22. Забиндим метод на объекте Взгляд изнутри Используется такая связка: __bind = function(fn, me){ return function(){ return fn.apply (me, arguments); }; }; this.printVolume = __bind(this.printVolume, this); Можно писать самим, но зачем, когда это может сделать CoffeeScript. JavaScript - не нужен! CoffeeScript - мимими
  • 23. Меньше буков class Drink var Drink; constructor: (@volume)-> Drink = (function() { function Drink(volume) { this.volume = volume; } return Drink; })(); JavaScript - не нужен! CoffeeScript - мимими
  • 24. Сахар - параметры по умолчанию class Drink var Drink; constructor: (@volume=0.5)-> Drink = (function() { function Drink(volume) { this.volume = volume != null ? volume : 0.5; } return Drink; })(); JavaScript - не нужен! CoffeeScript - мимими
  • 25. Хотелось бы упомянуть 1. Cake - система сборки CoffeeScript 2. NodeJS - просто NodeJS 3. Презентация о coffeescript с котятками 4. JavaScript-Garden - документация по самым заковыристым темам языка JavaScript 5. browserify - тулза для использования require на клиенте JavaScript - не нужен! CoffeeScript - мимими
  • 26. Спасибо за внимание Евгений Власенко CoffeeScript Developer @ Noveo http://about.me/vlasenko