2011年8月24日水曜日

今更ですがTitanium MobileでCoffeeScriptしてみた(2)


Titanium Studio で CoffeeScriptが使えるようになったので、次はちょっとフレームワークっぽい物を作ってみたくなりました。

目標:TweetaniumをCoffeeScriptで置き換える

とりあえず...
  • 名前空間をサポート
  • ソースを分割して書ける
で、こんな感じになりました。名前はsyrup。

syrup.coffee

define_global_variable_js = (name) ->
  js = "if(typeof #{name} === 'undefined') \{ #{name}={} \} else \{ #{name} \}"
  return `eval(js)`

exports.namespace = (ns, block) ->
  names = ns.split '.'  

  # root namespace is assigned to global variable 
  target = define_global_variable_js names[0]
  
  for name in names.slice 1
    target[name] = {} if not target[name]
    target = target[name]     
  
  block target

exports.use = (ns) ->
  this.namespace ns, (exports) -> return exports
    
exports.include = (file) ->
  Ti.include("#{file}.js")

model/entity.coffee

syrup.namespace 'MYAPP.Model', (exports) ->
  class Entity
    sayHello: (name) ->
      alert "Hello,I'm #{name}"
      
  exports.Entity = Entity

model/person.coffee

syrup.namespace 'MYAPP.Model', (exports)->
  Entity = syrup.use 'MYAPP.Model.Entity'
  
  class Person extends Entity
    constructor: (@name) ->
    
    sayHello: ->
      super @name

  exports.Person = Person      

app.coffee

syrup = require 'syrup'

syrup.include '/model/entity'  
syrup.include '/model/person'
    
person = new MYAPP.Model.Person 'Coffee syrup'
person.sayHello()

あまり、意味のないサンプルコードで申し訳ないです...

プラグインを弄って、依存関係を手繰ってソースファイルをソートして、app.coffeeを自動で生成すれば、もっと楽になるかな? あとは、どうやってbootするかだな。