{"_id":"caboose","_rev":"248-7caaa3db1339130a9b3fcb7b7fc282d4","name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","dist-tags":{"latest":"0.1.65"},"versions":{"0.1.0":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.0","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"27627dd7f8b50ce76a10e500187e747825007a6e","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.0.tgz","integrity":"sha512-MCMiGXw0IogAb4XVcb71cBS3dlOpw44B4WwEanJPXxnY2Qbmv/eSiYhllS2gRzTwrKToN09mf5lfPE/MrKLR8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFsE4Y1Ydsl4Yd+gkB3FMvtxlUqi+Jz5cw22SwK914nDAiEA/2P1v0yJD+TiUAy2lj8oUx22f7coyy/rxEHZrTdSQkw="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.1","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6ae826f3b1a86e862aea5c73c16b1af98d3f2650","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.1.tgz","integrity":"sha512-xk5EaKW8LsSLbhM+lATrkaHpU5CCKga0rrkXk3YiaBoNhWiTN+av3GcQRhzHnXpLwEi6+Scza52QzvdeSs1JXw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCa6pXNfWjw1jRBdcEcsJhG1lJyZo3sxfeEBfKr8xeUnQIgeLYaxHhjyXXvYdV5onjqw31nntjoEoDP1UCNAXLUlSE="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.2","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"79330ef47b08247a2c93cfa95a54b5d751adc9b5","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.2.tgz","integrity":"sha512-y146lzxKEfIN8UHeRzuY6fptJcLhrW+8mlD0N6zt8kOXO+LNr6KuWe/eHZXLaziO8y7+ERCbl2+6KSePiGVFBw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFLaHYs/ci3vGfcMS0tmOTIYUyD/EchfbJ3X/XwXGmOjAiEAnMbsRK+ofkapWviruQNiqhogZyWBHPQfdTxjdYr7m4w="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.3","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"bde31b64f726db7a21bade65ff730a0ebad464fc","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.3.tgz","integrity":"sha512-5oXCH0M/WnaRDvY7v2n8wos62OGHl0VdffXtaVpHDW3DJwYM/TnBo9rjnidTpbSqv1g1TLs/qmDqK738crnq/g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF1SUeP2PkoJ7l44Q/QD1xJGwfmtUqZ4ZUZ/KJKmApN7AiEA/wTis3d6a28RxT7dT8UnbdvExR77ERsVtpzJpp2HUoU="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.4","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"9bdaa3f270bca14d22caff6dbd7a3573e602ea28","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.4.tgz","integrity":"sha512-nI/uHyQRwEcLxRGQ5sQA75zFG0sR1hfCt82RBIA22igEO7aW2h8PmKeg46inO37p6hYr8OA5T0kqZmkv1K5g9w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICbgG33+RlFtNQRBUz0LcCOeUxjw3wHIwTxHlOI43koMAiEAk++5XJY1PufZpa9RVYxZyBMVV3boi20TrhM09+CE/b8="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.5":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.5","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"be2db81a849c98b7ddd8948d5ad386c859903f7b","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.5.tgz","integrity":"sha512-anB7d+jzzVY2EsnqR9+tym6sSs9Z8MTBrqyN2hQU6H3FSqEUsVjg2Vd+2TsH+z/RWq2r9csu3rBJ6Y5ELdazhg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDhLngfOFetb00+EdxD9er82eV+e8AueFuGCMFBqGxR1AiEA+87rTGdZgEhnJzjDbk6j3tR7Ij7RhkQkmafnqmhAUqg="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.6":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.6","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"bb988364f80622094fbcc6cf2aee06bf274c48a8","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.6.tgz","integrity":"sha512-SYTWLpYVI4H5DZElAOYmVk0GSIgFneUIQUekSu5+uc2nimmqsBuVLQtECQQDdM307K9dbCLJ65D2bfu7uUNt9Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjzQlzTQGI1OdwuxB5kbZ6Z3Jc4yZmDmmTp3rlaE3VbAIgRbqMIU02vuHKRJHC1TE5JJlDll9Chpu85+oUUEq14hk="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.7":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.7","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c798dc2e2af32d671e5997bcfea8791305be8b92","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.7.tgz","integrity":"sha512-3dRXc183utjr7MWqk/7c+7E6Qtnq4cAELJXAoNZAXIVmm36PmSa2mUxwRwZXf0TALWoGIvgpp3oH0BKA9/D59w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpmv8zePP2+J9BjT8AboCTotIWw4CLfpTV76eIXQNf5QIhAJBDUcAIHsZ4YtCdd3jLeuQcNMsgHLqzrAhrlYzt2clX"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.8":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.8","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"53034d6425309330e501421347fa66a4c40d815b","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.8.tgz","integrity":"sha512-pUcklCp6II8+NMAh2G5GCoxaZnpuy4oGLXP0erzbIBY7l62hQPu9ilhurg6CMGCd10V20RiiZ3LlpI9KZZZxng==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID3BVKrHJSE2IpSlZBTyVmPGwmEJDAFQVv6eKnq25agaAiBCqW77X/ifHH9QomvRzzCIgc5CEXiz4j+p2nbw0Vz+DQ=="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.9":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.9","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.9","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f9c3302b373017047f2d4d00afa450efae2418fd","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.9.tgz","integrity":"sha512-vMj3IfufOnXIrai+oBDlHVwp2pWAYVDLgvD07C6svAkio0I6g1y8x8P2X3d6EDkvqUOHznMz8m85ndiDwNNZNw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDb4g/Df3eqK2pSBvzrUSlfBLH7AOc2F4j0nZyGi9Cx0AIhAMzGZSfc7kDXB3BzHyGlYgp82liddqabN8TLOpesfibn"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.10":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.10","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.10","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6f2e9006e12209539863c3b138b76b0ab7141df1","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.10.tgz","integrity":"sha512-3bRojb7GuDx74TWpfEB+8sALfwAsZDb78Aw0MIABpW3ZshOQRz5y9Wa7udeP2B4eRNv+oIUxvGysL5q2Eiyvzw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGYwfV1TojX2Sja2io+d56ij36u30o5KzhJ9qLQMzG3IAiEAwoimqS9Keit5nsx1bdAcDQ9NEr6hNaIenGQp2bkedEo="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.11":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.11","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.11","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7588588401b9e5783ec14bf7545dc66b43f9c2bb","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.11.tgz","integrity":"sha512-M0ErD8YZD1I2SLDiN1WkUjGBe45pBt67PwydqUYF4g6WeArVO0lfAbpouW72Yn1KgpDBrWatdPt3dlP+gvlKpw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9T7ZeYrBvAdi7xiwj4HK3oNn6gdsiYQxPrNngTOOvlQIgF+uuuL3Sg5qkNYmRm0Gri5lFwPARzNceTe1B/itakPc="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.12":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.12","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","ejs":"0.4.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.12","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e2bfa6bc3dd70aa0c2438772fef26a62eed0b7a4","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.12.tgz","integrity":"sha512-0N1zKbCE+tY7k28tGxePSLLb/SXymB0gSXVzWdm6VXiFnlk15fhnZkWYONXw6lhe3vZJwVYfbGb7TKpiX6KmzQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBdtBUpEiTzx8ZK8aJBEK7Mt/kymQrM8feohM7UIRdnQIhAPfuMA6hn15T/yMVFiS0zwulVeybHEFBa5/zCys3gpeN"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.13":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.13","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"bcrypt":"0.2.4","coffee-script":"1.1.1","ejs":"0.4.3","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","rbytes":"0.0.2"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_id":"caboose@0.1.13","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"958c09b87fe41bd75459705378b5fda5770db07d","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.13.tgz","integrity":"sha512-nALzz+IJhZQKWGEMniS7g7Fbnxv3Tl8wypMDaOCFmoKlMV4w7vOcYpNpWb//EeIi93E0jBLlCUHpIOufkiutZg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA0vCmYJ8NqNu+8cyeFgDKFPmJklCAtq9crp7+RMSYXzAiA+f0Iw3s2wEfH7USPwTkrc1m7T904+QEydl+gaDKP3fw=="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.14":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.14","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"bcrypt":"0.2.4","coffee-script":"1.1.1","ejs":"0.4.3","express":"2.3.12","mongodb":"0.9.6-10","optimist":"0.2.6","rbytes":"0.0.2","cliff":"0.1.3"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.14/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.14","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7ed21fed2942355e5d7b378ea81d961014319b84","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.14.tgz","integrity":"sha512-wvjJrZZ1FzmkEj+yzdpnacLKGJL0dQgGgFXkd/Tg+3B0xFcUwLT316V6zZdaucWO7GYmQS1dhLmgEse7VGZovg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDt95FFHCK+lpc1gfukev8cv5MYI/1Gm3H5QgdU1H1gQIhANdlq6dIYn/hadLxecyr9dDzC3nKM/sVA3aaR13tiaAO"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.15":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.15","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","ejs":"0.4.3","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.15/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.15","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5f3ce481fe66adf208a1d4b971a7588a50f24ecc","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.15.tgz","integrity":"sha512-nUowZMEBftDRQN6puWtr5EcJD8nUZpZ6P/pSzAL1rxD88BGiDm+8iulICEzDWdNQPtFfvhTlYbc6DuhpG/BslA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDY+vwf9Lyu2+zGiLsco9Sj0PK6ge0pQS4j0JkTCuHmqwIgDdBSyIJzek3Mh9lyAxWZ8Fmt8daGoX9HNDTbpBVrU+A="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.16":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.16","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","ejs":"0.4.3","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.16/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.16","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"32005bd9e0266f1f7988895c03d118b218e13334","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.16.tgz","integrity":"sha512-cr9ceDKJ9BA42cuNoZtGbkihFxoMTGxKjYejN/rLH4D5uaHltCXtSTwVXiLtj22o86uxDJdxLIo0EA6hwkVuoA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkjtDMiKArJ7v6uK7QBmtmF3+JMLdDWCo8WomVadRkeQIhAL/GlRlJCX0vQE8+C7bDQNB6kIgccfHCyOF4txIUeXN6"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.17":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.17","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.17/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.17","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8321b2b19c3f8949a4d03b074106c342069fae79","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.17.tgz","integrity":"sha512-4TBf5OXa4BdiJIcrzubhYRrNlTacKTEK24/Bqefxpb+6PeVNDcaGI5d7AiQnqW4Ni5/cdGN0TKdu2t+HAfHoow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDEo5caDi7zzUSDgYfOxaFGyeOCjRpvN0I7K5Juv21EQIgHde2AjZOs6JSNVDXAPpf/m+/OOqvsgB86aXj/g6QMnY="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.18":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.18","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.18/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.18","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4ac39603e858bc9fabd95281527ed7ded93f721e","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.18.tgz","integrity":"sha512-3OL6gtueerRS+lX7yHu5ROgW4qq1w6zFRP/HllmugZSHWthKhvPXrePHkvbRanIFZmiIHv5B7oF/q+CbkBrrNw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDODi8zuv9VqvcIdoODRrtJ4VVuNpyKklD+aKV+bdZkbgIhAJJ5gv7QFr+v4e9raiBdL4H02TgfACpwFEOILTDOunuv"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.19":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.19","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.19/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.19","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fdd46c0f166b9135c9b9294cb9e1b61916afdc41","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.19.tgz","integrity":"sha512-2NXGz9hSU/4gWB/cGF5qWDCn70fKxY8xibvO8zyrF/P/gGJ3Y3w+Fhnuh+ZhxNEWlUXRHGquEwS+1TQsxU+aSg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICZn54GibQyD2GNzd8R/x7+2ipbcVf/2vBXkHHBfCfB8AiB5SnIwanY5jU+aaH3coqVGrvtGq2m44kFCRyGlWbPBDg=="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.20":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.20","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.20/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.20","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f0aee7ef767062d6bef084508940e1cd9c9e6354","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.20.tgz","integrity":"sha512-uCi9x5UfS4o9PTd52konIQXhUZOdO9LtLM5m3XZCRU2Sg5blgKSO6LAIrXfey36/MVSnf6MNTdSdIq3fJMtVjA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBzCz/yYrFry0gK7VTlns1tBJX3L0P+xQUcJzznz7vf/AiAg6S/nMbYY+58i9dUZHsVW4WPwWd9Z5tliwyANvln4LQ=="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.21":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.21","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.21/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.21","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"09801f5f75ab339dda960fd0fed18802aa80c4ca","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.21.tgz","integrity":"sha512-rqTE0Ch4BYYXQWBk0r4eVnvOXVyVmf7D+oaXVs0VW/6zdJSXmuaCjWNoGp7E8dMaz6Phr46aeaQ+wflPcU6gkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuTg6JW7HZrkcMySgbSm18AMiiewEy4xPThhnpC3cyRgIhAO2P4dlb7+auA3zORvBT3E05mt21kUr5q765rFLQHNVH"}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.22":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.22","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.22/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.22","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3042b59e2a7cbc54427f51457aae5747d44b5848","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.22.tgz","integrity":"sha512-R8NIkBew2dhWwZput1RAOzHavvG+58bTN4Hxt8VCtbmCETvWCU9KM2MjmwedHc7U/df2ZWjWou43pefcUMtK8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+ocubFEmBEwyKa+E4vRdXzTfGwQZ4an7IUGeiWVNt5gIgQgLF35p2RIpPMErquHLrOSi0qMs9ZCaorkM73DMqaXU="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.23":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.23","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmJsonOpts":{"file":"/Users/mattinsler/.npm/caboose/0.1.23/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"caboose@0.1.23","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"daef66b60ea8caa0f51a589467ffc010385eeec0","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.23.tgz","integrity":"sha512-2N0MS9nH6IHUpZTyEIKr/biWGqH9rdeYmrygYFI/tYgoGJmglHexdxxjo1VVm3rzKC4In/mehnFNEILWpxxFwA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8TQMEf8Qv944Fy0W9IqexP2brbsMLNmWnZYnZxWG+2QIgKUOg72zHmB4DZOB0vmFFShNA5a6LZ23hUBpDjb2qR1g="}]},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.24":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.24","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.24","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8b693858977074e5f0558dbe26b9e2457c78a63d","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.24.tgz","integrity":"sha512-eY7c6FukswTWBoZ79eORol5tVkbqXzgvmhRxNzvAEvAQ3MbFWy493gtBTekr8szRT52mbdRpm5WwIV64ffyMwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF9Fyh4XGhJgEHIqBwrtCCAZIOKMoVt3WVkKUf66fQ1DAiAaeeVdKKvo/gj2W200epN9fodbHhGNpz4IVmNiKkuXfQ=="}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.25":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.25","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.25","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b7d014b0b4857bf240d83756bd2ba98817eaa49f","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.25.tgz","integrity":"sha512-OA5elwkMKtjJt0YZ95arALdZixwkibDvFMXyd8SUO31oYUtHxW7tEZ27UoUl52gmBSCk5eL5Nr2hVcKb/Vffdg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCidqQyK7PDtEljWKwSEGOAZAQ1ioplHhsHAmdbCBTYRwIhANcIgRK7/+SLU/55iCwcTk9EM+7s6TzJtqPzLyZwaUHP"}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.26":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.26","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.26","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"80ac6d0c4ce6ca0a87c04b4fe1cfe921e9e510ab","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.26.tgz","integrity":"sha512-GneBGmmr83v7goQduaChBIXU4l5rO/JbmIW7ZEBk2j1t/Wj4l+F30voNdjHbWOtAheS/ergZLsBIVhSc+lk9Tg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCqV28WqXwV3DZxBeyereibuK0Innlu5OCjuaQVpdIhQIhAI3PuPlE53drRjoV7WGklKcH+3ErH2ovsUle0XMxFMmG"}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.27":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.27","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.27","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9666699c2d9816ac51e230f4b2eacef579750778","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.27.tgz","integrity":"sha512-vZhWOaTlYdurRjQ4nme83lrO0uNjc0fXeWvU0nuIZoCxBKF+cZ/A04P3kDibuHk7Now1cciv/WZ0FvolpcBDQA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBgZ98pUTdy7V8GBRHTYl5/n2JGXf1cgwn8lo3LWyfqGAiBIRR0SlrlrPrpeNU8iuRJBcSqUlLd7ze0an6HEamnxpw=="}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.28":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.28","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"0.5.0","coffee-script":"1.1.1","ejs":"0.4.3","connect":"1.7.0","express":"2.3.12","cliff":"0.1.3","switchback":"0.0.1","mailer":"0.6.7","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.8"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.28","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"dbacf2a3de3a492b502924d2cc742b96cb87963d","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.28.tgz","integrity":"sha512-DAamcRzdW5yEHpU+Jvx04uM9ilsecSckMeS3UfE+KmCMoIhQP8D0H2U/mrZR5nXG+DCzefYGU5uO6j4r30IC/g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCd7XLmbhBSAF+y9oIYFwQrC75TiShyjoT8c3do9KoP1gIgb2FT7x4/0LgemF6EtbAL20RFDyvEY/fUVJKPpf8rcko="}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.29":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.29","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","consolidate":"latest","npm":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.29","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d21513f0022df909a3a0605cdc6b59ab34a6dc05","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.29.tgz","integrity":"sha512-Q/oNFQ+HUdR0oZ2JY1uvuURaTFvyBUKoTCNTQjMWY74d/h6kSSjqkGB264G9zp0nzjRhsdMUPCcXTDoKBemUpw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICLYx4ifJURshGUuUn6ENR8/ubExOAUIKfNXCNvszMsPAiEAkqDNMMgfytRkFiW2iw2LJoDuKE2tpV2xw75BB1qknf0="}]},"readme":"# Caboose\n\n  A [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\n## Installation\n\n    npm install caboose\n\n## Getting Started\n\n    $ caboose new app_name\n    $ cd app_name\n    $ caboose server\n\n## Related Projects\n\n* [caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.30":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.30","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","consolidate":"latest","npm":"latest","kexec":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.30","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"447f6f624d7aa8126c339baa0a5c15150bda52b1","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.30.tgz","integrity":"sha512-qSQ/ClHy1PNLquIobVUa62JXT4+Q7rGnITDtD+8JqAeH1cephN13IaxIlahfm0tulteTBwavh+yx8G+hLZdk/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEukUZ+iD2KxCEUHRjOqaFMGP8GSzkjmv6uKVLHisYVmAiEAtJorngcKUjYSdM4unYI/LLLp+ClJowvsM1PjTCaGLjU="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured port\n- Execute all post_boot hooks configured during initialization\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.31":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.31","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.31","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"bfb2b47320452036e016ea04c56a9ec584d5ecc9","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.31.tgz","integrity":"sha512-fs60PUSO9or07hopK0Zf++7xNNNkjqKfDgPTPjXFqcK2l5+ATJYLiVl2qGIz776Q3keJhYz11cg0GUs0L7tBEQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICZ3D3fERP7FvPjOynrw07Z2Zmutnaf6xZ1CU8TkNZg6AiEA7hTYda+ccXULvbTCUR15zmxN42KiIj+1xIRUC0t/z6E="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.32":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.32","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.32","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1682f07f0277a2cc2590a10b2e72fcc7711f9ab2","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.32.tgz","integrity":"sha512-2uGYyQ/XvC+jS7zPrqki6d+v1hA7tK6gGy7sZqMLDBdv/vk8TCNWdsuDk+iIJSCZd0NTqdaX0Wx4LvgIaytmmA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCqb4HkubFg59c40Y13lDoyVx8c45TfQrZRxOPwgq8oAIhAKV5lwMeRI+rROnLrnT5+6YaE/xz9ytwMA/c7QgpcxqH"}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.33":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.33","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.33","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ebbffd028424aba2a4013274d1e48bd88f694640","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.33.tgz","integrity":"sha512-govYfFC4Ck37nVsxxEn35grjhq/RUnPoIew/3P6daRD73gaPEEdAtdwMIorxiz0dCUEpgTnRj+x5leDBeuuTrg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTPtnPpLkRH8Ps6/X4dO45TkZBDyQeb+qK6pDdUBAY6wIhAJ2fSL0f5+hNds/D07uJBJYukY7m68b7BgBxUWTQNpQi"}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.34":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.34","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest","mime":"latest","async":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.34","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b0d6d000e01a0fb515e22ec6e1b2cb52b90a3a79","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.34.tgz","integrity":"sha512-Io/gaGVqb80PtAC8tdhzpCi9FCWvzknmBL6UQ6qyw4NkyB6bSHK9jnnYz5rYUmoE5j+XcBPoYVN/7K5GZzu06A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF+ArvtPTdYXqBDXtZAyEHBEwV66hCQMBgg/tAFyf1FeAiAZDTsf+xAXKacJlmW/LISuVQTlOXDEYtAOrMdAwmqwHQ=="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.35":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.35","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest","mime":"latest","async":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.35","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a6404f64d7331f49b3ab69a0c0bc117ae4840e2a","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.35.tgz","integrity":"sha512-mpSgkll1ASyxGn0TFWv/ij1auWCG/VMVzV3Iq9wKHLttN8ccPVhqr88MCC5JGSlMcK5toXYO3iVwvhW3xLxydA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHcA3YGikbUvhwXwOzyfQO/ZIynTRDOBfDUgU2o7/aiqAiEA8Nj2Af7/EWn0NhKehmTLH5J67aDL9yrlgfKHfLafq6Q="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.36":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.36","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest","mime":"latest","async":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.36","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a259a857662634c49f937231b02cff93ec86794c","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.36.tgz","integrity":"sha512-PsdY1JYZsUU4yLrnlpf0v2q1DRvdDCgO65PCkZOaprQV8A0cDK49FTOHqaUJeSK2Ug0NnbYbi7ESMOhn+57Y9A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgXj7g09SoxYoOu25lUldvZ9BaikIwJO8cReFLZNSUYgIhAI6leFIo2TZYS1YD9TNt1Uv9SpPkTeTxxJ64yavN6pGz"}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.37":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.37","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"latest","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest","mime":"latest","async":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.37","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b9c395795a379ef92c31be234200f1b9d9c07457","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.37.tgz","integrity":"sha512-HPcqOs30ersx/S8jrT/jC02dwGekgSkNhQFdvJge2wCRXgwj4KAwTcXcibM5gY/I1E3av3sMBbol7BF6Ow1Nig==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID85tTUclSgYenz38j/yqEFLKwcx4A3+TWD0TWkE7bT8AiAaUfTO74BA2sHpMxxIxTxwcfQnitRmZyw9pe9+Gm68Fw=="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.38":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.38","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.4.0"},"dependencies":{"colors":"latest","coffee-script":"1.3.1","connect":"latest","express":"latest","cliff":"latest","switchback":"latest","mailer":"latest","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","kexec":"latest","yaml":"latest","mime":"latest","async":"latest"},"devDependencies":{"vows":"latest"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.38","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d70159f00e9f3fb2fd5c2de10329a0defc69066f","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.38.tgz","integrity":"sha512-DWoGCuAjIeSQ7u1iDje9tQcc6cOjUjQHOhIAVF72YvP4egaxtgzXAX8EbduNbcfRZ7gmW+1JC0pF5UfTY2LetA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAmSP51r0nTNPISa7kWY9yGHYlJrBIHa4eLgX1kIZ5qLAiEA11WIvaLZgKsF0ip8n1BeAz0W+f1/bKrHJDxa3wnK07Y="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.39":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.39","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.39","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c8cb59fe50181cf2b0dcb2b251a8c9509362dca0","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.39.tgz","integrity":"sha512-ZFKag0jf7EFpaTG0gwRga6dvId/MglFNT07pF0T0Xwx0kagJbqPYIIcs1dkfQ5W8K46c2Y1niCjtEKFaJ3J9Ag==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB6x/iJnNvWrj2efTb44/QtaefEjp+BexmA0YlJ+q9GTAiEAybTBlACn8AdQvcMRtI2t8unyMWYmS4XuSU8jKmyBGKk="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.40":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.40","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.40","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b968ba2cecda44b12c6ff7200cf4ce31d0795058","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.40.tgz","integrity":"sha512-MMHuoc1H4sltmY95dZIJnunL0vnH0dYsL5/J+CKppyehMufxeKa6Txw5fKCOxzFAwOh70NdB5XRuRyIQ9tpmLw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDa/2axMwhW6IGOGhT+4dRX2os2h5pfRH4x6TFfVt0wzQIhAPPLws8wbNdu/nF2QUjmv/2pBKTA8O3Yu9btUOQew2HP"}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.41":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.41","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.41","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cc204376906abe9f1bd2696eff95f87a113cc19c","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.41.tgz","integrity":"sha512-nDxVkRufloHSsZ7E92Z1WKAayn6FuZPaBk6yGgYsWwNpkeL49BQEak3i2MKYV7CQoL+qMQXqjizW0CppYAsYeA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA3+y8NQVCoKVGk+dYidUaEvmu9z3ocsS+RKdWE9z6VrAiEAraE1KJVTRK0uD8hczYhOHj9KgGQiF9fQ4x5Kg8zLzk4="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.42":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.42","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.42","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"854fb45ce11110b5b48d0e11fe3849797ad452a4","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.42.tgz","integrity":"sha512-yqGKKU42eTV3h+H72AcfQ1rh0iT3nL5jTY3LeOwosEwHNjWp+Bm/MHNfRPcPSxwuuGInovfNDskSz+Rp+ZG7rg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAYZJo0v272HGSdgrJW7Ank67xp1JB4YlaJqDNvSlhdIAiBRmysBffWBn95fFl4zNNThL409cAFyJhyU9u+fan7Uwg=="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.43":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.43","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.43","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e7dcfcb9b2f744ddb3d170972c17cd3697182f2a","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.43.tgz","integrity":"sha512-7hCkJ9l/9i6xTsT80xfSx8XyPw13P7LjeMbizAtch/iTE2x2J9c2W0N49rjbvDZxj0gdrbl7/w+BgsY5QLZD8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVBcyDbWKwZVUmr7zgtF4n+CE3k9rwZE5ugOo0gmsFOQIgEL9vnBxPkR4zoteMvUcolTkvMGZkNnjD7A220zlFUe8="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.44":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.44","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.44","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f2bb152a9b9f50cf56d9b726bc8ad3da71c94d73","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.44.tgz","integrity":"sha512-CaRWSTQ+wD/pwJefoe6e/8ZNBebVAeTGS8Jjccs2pO3cv3ZOPpDiazExi1EqqyObwcxtQ3aTITnI8aS8EVXRaw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGY6FfKZBfHzoereIkyprf9vIL//n4D6FrgkfqXOd6KeAiEAxGo/NzpHmwMTfyAK8KJUIMQrD1A0mlN3HpQI5oas3Ng="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.45":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.45","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.45","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6a7a9b980cefe6630f779d358d582264d256c421","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.45.tgz","integrity":"sha512-9N0JVoZp7XWnDNbBXlzZ4flXBH6V4/+t6OKCtdYBbiJ182aM90ucUehKXO1NozWQJ7gUG8p+JNhL8605NAWBlQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVC7Uhmxg1sANMpshfUyuOyjJ2CyMxLtgoRA1iPRw/ugIgBvIlPWh3Ojbw/nM9v9sNYumSy1XmVgRUz3ujTdnLMc0="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.46":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.46","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.46","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"3af39a13ce3ae3c058c1fc0cc8148927853d8faf","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.46.tgz","integrity":"sha512-8LQwSDP+pQVe2VqrtZ0Cnm/+p56LkhpM254loTjBGCl24SgNaZUQHpl4quRYOmP6n6LrYLDfNG06Ow6fAjBKeA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvsakF8CcUh0Op9SyorL970Zz26yumsSGLa0rDSrhLLAIgZaMevhDC9dqjCO9c9JswUfOje+qXQ5ZEdMb2yE2v0AU="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.47":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.47","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.47","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8ee5c7f779a67f9dc1ac8848a4ed887f73e7e830","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.47.tgz","integrity":"sha512-H0nj0XzBz2LaayhdqtRS7EFMJq2aTIURX6xzJ/NejFyq+hA2jbQy9AwIzbAJvJLq9eKUHgPpKtaGTDwLSxVqLQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB3tRA+LWMLKYgtxt79lWbrCB631Bwd+ZsrIOoO6SmAQAiEApNKt2s9d+bd7vjIykIk8cTLvyqp6i1Ovw0yidUtY/ZU="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.48":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.48","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.2.0","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.48","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"3df16d5473fdfdf26d3810d5b84d5fa57ac20963","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.48.tgz","integrity":"sha512-gFhYpMOkAxB1+zUgM5/aleojampoGn5H2QpgCvXfzoTi54yWyDMRNNJr4ZBw71YfCCRuf6pJWy4EO7HFy1SQPA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICfRBjQT4l/moAUQ3MHym0PL4RBUArVkVm1IhftjmFMdAiEAxio4d20MN0dDgFLqwa/c56y1D4+tu4HayD0FcrZos7Y="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.49":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.49","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.49","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e1b8a0c97814780bec69b15a90588511f387ab80","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.49.tgz","integrity":"sha512-fU24Lg5KzYXEpEbZtmAPHIkPE5QAQIlSni0mIJXbeQ7m+G6I5EBqOy7IGnYILoziyHVnTp5AzSJ15/Npp+AUcQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdbHidYI1TjdPeDtZdjaLubf2yuhckZAiV0ZMUR0RskgIgL/Fb++mHFmLEMGvAY1UM3J8hBiaVkM7vjLODLsoRGRM="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.50":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.50","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.50","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"121ffcaed1babcf0b4ad164730acdd87feb97790","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.50.tgz","integrity":"sha512-6WhFL21zSVnGdB+zEGtgLJXdV5e7k5MsgndYgTyX4Y+I20cLfFkaa76NxbwenWQjGnN4xnDJPhe1LuAOSkHnMQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEa6xENVxPsNCoRohe+ftqJCKWiYG7dCwCFnBPbsvNn+AiA8Tap7cipfYXLiT4alCgMWzPRJ0ipZzbHmeBx8aq+n4g=="}]},"readme":"# THIS DOCUMENT IS A WORK IN PROGRESS.\n\nPlease send me a message with anything that is not clear enough.\n\n# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n  \n### Useful Plugins\n  \n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Project Directory Structure\n\n    + root\n      + app\n        + controllers\n          | application_controller.coffee\n        + helpers\n          | application_helper.coffee\n        + views\n          + application\n            | index.html.ejs\n          + layouts\n            | application.html.ejs\n      + config\n        | application.coffee\n        + environments\n          | development.coffee\n          | production.coffee\n        + initializers\n        | middleware.coffee\n        | routes.coffee\n      + lib\n      | package.json\n      + public\n      | README.md\n\n## Naming Conventions Matter\n\nThroughout caboose, file and class naming is very important.  These conventions allow for flexibility and ease of use.\n\nIn some cases, files with js and coffee extensions are used completely differently.  These cases will be identified in the documentation.\nIn all other cases all code can be written in javascript rather than coffeescript.  Just change the file extension to js and go to town.\n\n## Boot Process\n\n- Parse routes from config/routes.coffee\n- Read json files into config\n  - Read all json files in config directory\n  - Read all json files in config/environments/[current environment] directory\n- Execute configuration files\n  - Execute config/application.coffee\n  - Execute config/environments/[current environment].coffee (if it exists)\n- Execute all initializers in config/initializers in alphanumeric order\n- Create http server using [express](http://expressjs.com/)\n- Execute config/middleware.coffee\n- Tell the http server to start listening on the configured portions\n\n## Configuration\n\n### The current environment\n\nThe environment is set through the CABOOSE_ENV environment variable.  If CABOOSE_ENV is not set, it will default to `development`.\n\n### Config Files\n\nConfig files are executed during the boot process and are asynchronous.  You can change the config object passed in and when you're done, just call next().  The default application config file looks like this:\n\n```coffeescript\nmodule.exports = (config, next) ->\n  config.http =\n    enabled: true\n    port: process.env.PORT || 3000\n\n  next()\n```\n\n#### config/application.coffee\n\nThe global configuration file.  This will always be executed first.\n\n#### config/environments\n\nAll environment-specific configuration files will be located here.  Environment-specific config files will be executed after the global\nconfig file and operate the same way.  Edit the config object passed in and call next().\n\nTo create a config file for a specific environment, just create a module with the same name as the environment.  So for the development\nenvironment, config/environments/development.coffee would run.\n\nNOTE: Like most of Caboose, if you'd like to write your config files in javascript, just rename [environment].coffee to [environment].js.\n\n### config/middleware.coffee\n\nThis file allows you to customize your entire middleware stack.  You are passed the http object and can configure any middleware you'd like.\nPlease note that the Caboose router is used by default and is configured by the routing DSL specified in the config/routes.coffee file.\n\nThe default middleware file looks like this:\n\n```coffeescript\nexpress = require 'express'\n\nmodule.exports = (http) ->\n  http.use express.bodyParser()\n  http.use express.methodOverride()\n  http.use express.cookieParser()\n  http.use express.session(secret: 'some kind of random string')\n  http.use -> Caboose.app.router.route.apply(Caboose.app.router, arguments)\n  http.use express.static Caboose.root.join('public').path\n```\n\n### config/routes.coffee\n\nThis file contains the routing setup for your application.  It configures the Caboose router.\n\n## Routing\n\nAlthough Caboose sits on top of `express`, Caboose has it's own router.\n\nThe Caboose routing DSL seeks to be flexible and simple.  The routes file is loaded as a module and should export a single function.\nThis function have access to the routing DSL methods.\n\nHere's a very simple routes.coffee file to demonstrate the structure:\n\n```coffeescript\nmodule.exports = ->\n  @route '/', 'application'             # Route requests for GET / to the ApplicationController's index action\n\n  @route '/posts', 'posts'              # Route requests for GET /posts to the PostsController's index action\n  @route 'post /posts', 'posts#create'  # Route requests for POST /posts to the PostsController's create action\n```\n\nEach route has 4 properties; The method, path, controller and action.\n\nThe path must be specified in the first arguments to @route and can optionally include the method.\nIf no method is included it is defaulted to GET.  All properties except for the path can also be specified in the second argument.\n\nFor instance, the following lines are all equivalent.\n\n```coffeescript\n@route '/path', 'controller'\n@route 'get /path', 'controller'\n@route '/path', 'controller', {method: 'get', action: 'index'}\n@route 'get /path', 'controller', {action: 'index'}\n@route '/path', {controller: 'controller'}\n@route '/path', {method: 'get', controller: 'controller'}\n@route '/path', {controller: 'controller', action: 'index'}\n@route '/path', {method: 'get', controller: 'controller', action: 'index'}\n@route 'get /path', {controller: 'controller', action: 'index'}\n```\n\n### Parameters\n\nParameters can be specified on routes in the same way as frameworks like `express` or `rails` by putting a colon before the route segment.\nThese parameters will then be available from the `@params` object with a controller action.\n\nSo for a route like\n\n```coffeescript\n@route '/users/:id', 'users#show'\n```\n\nYou can then access the user's id like this:\n\n```coffeescript\nclass UsersController extends Controller\n  show: ->\n    console.log \"The user's id is #{@params.id}\"\n    @render()\n```\n\nYou can also add parameters to any route, by setting them on the options object, like this:\n\n```coffeescript\n@route '/superheroes/green-lantern', 'superheroes', {codename: 'green lantern'}\n```\n\nAny parameters that you set on a route will be available in the @params object from within controller action.\nSo in this case, you could access the codename of the /superheroes/green-lantern from the index action on the SuperheroesController at `@params.codename`.\n\n### Parameter Conditions\n\nConditions can be set on any parameters in a route.  Just pass a conditions object to the route:\n\n```coffeescript\n# Restrict id to the string 'green-lantern'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': 'green-lantern'}}\n\n# Restrict id to any of the strings 'green-lantern', 'alan-scott' or 'hal-jordan'\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': ['green-lantern', 'alan-scott', 'hal-jordan']}}\n\n# Restrict the id to any string matching the regular expression /green/i\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': /green/i}}\n\n# Restrict the id to an integer\n@route '/superheroes/:id', 'superheroes#show', {conditions: {':id': (id, request) -> parseInt(id).toString() is id}}\n```\n\n### Resources Routing\n\nResourceful routing is available with the resources method:\n\n```coffeescript\n@resources 'superheroes'\n```\n\nThis will create all resourceful routes for the SuperheroesController.  This is the equivalent of:\n\n```coffeescript\n@route '/superheroes', 'superheroes#index'\n@route '/superheroes/new', 'superheroes#new'\n@route 'post /superheroes', 'superheroes#create'\n@route '/superheroes/:id', 'superheroes#show'\n@route '/superheroes/:id/edit', 'superheroes#edit'\n@route 'put /superheroes/:id', 'superheroes#update'\n@route 'delete /superheroes/:id', 'superheroes#destroy'\n```\n\n### Domain Routing\n\n```coffeescript\n@domain 'caboosejs.com', ->\n  @route '/', 'caboosejs_com'\n\n@domain 'caboosejs.org' ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {domain: 'caboosejs.com'}}\n```\n\n### Subdomain Routing\n\n```coffeescript\n@subdomain 'www', ->\n  @route '/', 'caboosejs_com'\n\n@subdomain ((subdomain, request) ->\n    # put the subdomain into the params object\n    request.params.codename = subdomain\n    true\n  ), ->\n  @route '/', 'caboosejs_org'\n\n@route '/foo', 'foo', {conditions: {subdomain: 'foo'}}\n```\n\n## Controllers\n\nControllers are located in the app/controllers directory.\n\n## Views\n\nControllers are located in the app/views directory.\n\n### Rendering Engines\n\nView rendering is done through the [consolidate](https://github.com/visionmedia/consolidate.js) project and supported rendering engines can be found on consolidate's github page.\nViews can be written using any of the rendering engines supported by consolidate.  Just npm install the rendering engine or add it to your package.json and go!\nYou can even mix and match engines for each view.\n\n### Naming\n\n#### File\n\n[action].[format].[engine]\n\nFor instance, index.html.ejs would be the index action, where the client requests an html document, and using the ejs rendering engine.\n\n#### Directory\n\nViews for a controller are located within a directory with the same name as the controller.  For instance, if you \nhave a controller named UsersController which would be in the file app/controllers/users_controller.coffee, then the\nviews would be in the app/views/users directory.\n\n### Layouts\n\nLayouts are located within the app/views/layouts directory.  The default layout is always application.html.[engine].\nIf you would like to override the layout for a specific controller, just create a layout named [controller].html.[engine]\nin the layouts directory.\n\nWithin a layout, you can use the `yield` method to place the view body.  For instance, here's a dead simple application.html.ejs file:\n\n```html\n<html>\n  <head>\n  </head>\n  <body>\n    <%- yield() %>\n  </body>\n</html>\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.51":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.51","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","kexec":"0.0.3","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"_id":"caboose@0.1.51","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"9adc6a0f933ccee85f58e3d2dd3cc812eff2849e","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.51.tgz","integrity":"sha512-yCxNZbTIjDydxPMDoanxd6ZbABqDCENiZsoYz1lzvJKm7p79w7+ssiOBMfSnyOJhdyd1gRJhrJp/9XffpCEdsw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCglRiyfNygl8o7eprSCaBgM+E3nesDTFoR+5GYOabTBAIhAO74ZdV4vtMKY5h+MAGzRkm03L1mU4py5yYwMdu5lSIE"}]},"readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.52":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.52","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"engines":{"node":">= 0.6.0"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.52","dist":{"shasum":"df644382c5d7fa847112470a2af51f88c2c0cd22","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.52.tgz","integrity":"sha512-HLTdIDj8Qpratj9otlqJKdRioLJlc3hL08H1Zi7mSqAO5oZb7CIaqZA1BocuzzxJGjeacvn3jh3T8l93hZ0VoA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDUBUvWG4m1ySYz+XBSncUMzgdLWJQePafbpC5NP97w/gIhAJoeuYo1ao4qm05RcrYFoIi41SJyziZ5PNwir24Znttx"}]},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.53":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.53","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.53","dist":{"shasum":"1f0c398182c6738e40e3ac981558a7f8a2b8aae4","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.53.tgz","integrity":"sha512-hpawpQaB1uF3KtvfP6ZNh3vYbJlVwJVW+7wfYsVKM6E/o5eoZ1a4Zx+KF9wE5s/InApyaPFd0+T7mBPNTbq3jA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCA/b9TDVJ4monIEixZPvlhFDeGhMeQeaUUmlM9QlGK+gIhAMAV52EBzpMedUVklcm9Aig6VXmw8uLE7a5CgBeu6QKo"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.54":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.54","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"2.2.2","express":"2.5.9","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"1.3.3","underscore.string":"2.2.0rc","consolidate":"0.3.0","npm":"1.1.21","yaml":"0.2.3","mime":"1.2.5","async":"0.1.18"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.54","dist":{"shasum":"05515fdab73172bf1a20a8720804c5ea03bd288e","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.54.tgz","integrity":"sha512-BBzmKrrTkFEAU8/fCXqTNbS3x9WDn7m7cs5dOnXXbQ9t42FOXS52JiR2Dd5oVDP9gXVcD8AwhFVTVaZxzfWXJg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQo98JrGVrxxGIf/XXAAsV24M8zSFGLfwhuTGPfnuM3wIhAOu2mmetfhvl/RYzNxssJbiF1mqmdultsZjJZoziW/72"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.55":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.55","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.55","dist":{"shasum":"3a8509db89f5dbde838b609e8f6d4e932b4c1354","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.55.tgz","integrity":"sha512-UsqtSAPRFiFCQQ41CtbviSuhRCfxRHpDtDOtlgPuk0BxEIVvcohjhrOVeNLLS+vU6TjOzI+TnJGwxUkXCSwgig==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDqU51vic3AYmHqkASYq4lsnntiHW7rCS1gRYByN/38gIhANlwYiAuhPKbZzbvuaOnmKM49LxUTm5S2fZxURx+y2pB"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.56":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.56","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.56","dist":{"shasum":"ff809157fb3fa849862d36d5da15d5a45b400e31","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.56.tgz","integrity":"sha512-ZpKLtX95/vdoTLIdwYF/MwZhIy7O3fiDTHOwG0fmiO4L36o2B1qYJhP+aS9RCiVENGUFkOew7GJqi1ITQA5s0A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPfbaJ/ayOJ6tHmdwaSCNTV+UQChKAzY8TirTjM6f4gwIhAMH7Tbi6crpRW+XLIqwDPcAz5aZOInenwryyDshEN0Zc"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.57":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.57","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"caboose@0.1.57","dist":{"shasum":"656d036720ee8a914f6f6f23e8bde9df34a1811e","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.57.tgz","integrity":"sha512-QaAzyLdtc/UCQSdsBUXcsNw9PAhkVZK9+Vu3B6ZJ8eDRRpt4K89ZWV4Xm2IpHQkscJr90DfhEn6w8iFKF/AO6A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlnqQK7Om3j+597NhmF6GtYZzkEwxep1iSZIQT73KJeQIhAIH4aqOj8WBMBU6LwPnf4sUrT7bpq+bortAtNZLHK6sC"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.58":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.58","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose new app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.58","dist":{"shasum":"17c924ad9e9de49dfbc43a500e73c32128d48065","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.58.tgz","integrity":"sha512-DC8/WInt074U2R0HAjx4q/JmXy/hVAr6uhnKxFa+tUU82piIEe0Xyuxw1GF/HR7ba2EsJYPZohDdntpunIC2Kg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICjx6c4HFHvlO9/MHUTzr4zuOSOYnE3L00FmAEl5l2hIAiAZhRVeOADdhyO86Kq4wb9XheqgwkclEj+4WaJgduBAQA=="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.59":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.59","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.59","dist":{"shasum":"82a9505d420d886daebb387d5b2d3ac8658084d2","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.59.tgz","integrity":"sha512-ebHgClTwLjoP6aoVY2Kaug3xGfaLQE+cvDif605Wrkrp7/C3nSCkUAF93SfmZlL+3CU/fGVZ4BOQnbRcisdjhg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6kOANaoa14IImqZkIBuj2QdEShmaSchMYKUfkxNvRrQIgArUKjqzZL1f80AlcqYkSwgUUFxu6EeYiRNCgDgCRqsg="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.60":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.60","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"latest","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.60","dist":{"shasum":"fb04c37b3ec944ef2d8cd8593811a7634c32d1cf","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.60.tgz","integrity":"sha512-px3Y29K/SKQImw2Z+RY63wXhg6DPP0HyR4muhdFrGq6186T9+OV9vv2uqZJqdoY60d6Srxpkhyb5WtIuQxXmrQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFH8LPkL65DtAaSgcktJFxoEjcxb4Vx3Vm1OaCQNwapjAiEAreythupiog3UG2yjNkQz2naLdC6SyNLG/ItR6Z4VwLA="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.61":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.61","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"3.1.2","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.61","dist":{"shasum":"b1df61602c25342b55cea0107f97b1c0c6b57ef6","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.61.tgz","integrity":"sha512-NhVOgWOGNdWMMXYyZGwXYEdyxnmpQjn1TjJ8/sWwUzdZgGvRV8uhd2wTCdX9X0jnlWf1RXajMuXWPmLHatpsPg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBkJb8VLK1VIQmG1kaHeZVIBd6DPvaaIYxQocL8X8J3NAiEA+6eN859HLr0xpE0yZ0R05brpoYGfwkAoW486owLMcc4="}]},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.62":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.62","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"3.1.2","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.62","dist":{"shasum":"1e3811c67f9c02eb4530287da640c64553291579","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.62.tgz","integrity":"sha512-8ZlrJzbFVhXgUwgJXEEyh972BEajb+lWl8p2jO876Um/s9VFwoi0LXH2SN5PmRqQbuKI0iaDSDnSqAuD15wUSQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5cw6E83knyBU2W54uORXLCmPQW/1zhohEF3z7/ebU0QIgfErGYyiRgkO82ChwqFC2+N61qGT/nwdQ1Hq4W1bAq+Q="}]},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.63":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.63","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"3.1.2","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","_id":"caboose@0.1.63","dist":{"shasum":"cdfbc72c1f9f9ec58a96eedd8d8b41abd196297b","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.63.tgz","integrity":"sha512-YrTvFP3XsX/q9lr0wtlFRtioK0NtXG+oN08dXYqbyG9qVtsDrEze4vxkR4i/ZASaK6r+kQ+o0+UkWdDBRjP/2w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAQ9jylK6hF4MDLZaCw+ObGH+I+pGn8nYkvBStpDPkZNAiAAm0ncjPf8kO+VfJqLhTNaERqg7OfFRFK2iIZz7GqaYw=="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.64":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.64","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"3.1.2","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/mattinsler/caboose/issues"},"_id":"caboose@0.1.64","dist":{"shasum":"3656a9a8acb93363b99a276841a66bc7744d0267","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.64.tgz","integrity":"sha512-6O8udySpRq4kNf4F/FdTXV59qx9p5twOdM0bxmtMapibW9RnZoaa5fMICYVfe9DTp6MyVdmtSPc1wXWlw7WMdw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdZxKBAnkzFUxtAxFhGtWXNQpQXvl4y6uYHjusFdC4uwIgRGty7O+1lfU/jiOlywd0YbbkeNGQntAj0iT239UIJEg="}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"directories":{}},"0.1.65":{"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"name":"caboose","description":"Rails-ish MVC Framework in Coffeescript","version":"0.1.65","repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"dependencies":{"colors":"0.6.0-1","coffee-script":"1.3.3","connect":"latest","connect-flash":"latest","express":"3.1.2","cliff":"0.1.7","switchback":"0.2.0","mailer":"0.6.7","underscore":"latest","underscore.string":"latest","consolidate":"latest","npm":"latest","yaml":"0.2.3","mime":"latest","async":"latest"},"devDependencies":{"vows":"0.6.2"},"bin":{"caboose":"./bin/caboose"},"main":"index","readme":"# Caboose\n\nA [coffeescript](http://coffeescript.org)-happy [express](http://expressjs.com/)-based server-side MVC framework based on [Rails](http://rubyonrails.org/)\n\nCheck out the documentation at [caboosejs.com](http://www.caboosejs.com)\n\n![caboose with coffee](http://www.caboosejs.com/images/caboose.jpg)\n\n## Installation\n\n```bash\nnpm install caboose\n```\n\n## Getting Started\n\n```bash\n$ caboose create app_name\n$ cd app_name\n$ npm install\n$ caboose server\n```\n\n## Plugins\n\n```bash\n$ caboose plugin install [plugin name]\n$ caboose plugin uninstall [plugin name]\n```\n\n### Plugin List\n\n#### Model\n[caboose-model](https://github.com/mattinsler/caboose/tree/master/caboose-model) - A mongodb model library for caboose\n[caboose-model-delayed-render](https://github.com/mattinsler/caboose-model-delayed-render) - Delayed rendering for caboose-model\n[caboose-model-before-action](https://github.com/mattinsler/caboose-model-before-action) - Adds pre-fab before_action helpers for caboose-model models to controllers\n\n#### Auth\n[caboose-authentication](https://github.com/mattinsler/caboose-authentication) - Caboose plugin to add authentication methods to caboose controllers\n\n#### View\n[caboose-bootstrap](https://github.com/mattinsler/caboose-bootstrap) - Twitter Bootstrap files integrated into caboose\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Matt Insler &lt;matt.insler@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/mattinsler/caboose/issues"},"_id":"caboose@0.1.65","dist":{"shasum":"5cc6d22f4dc0bcee1d5e72a876330057fa249f44","tarball":"https://registry.npmjs.org/caboose/-/caboose-0.1.65.tgz","integrity":"sha512-ZV2gk3PQBIKTIySQeDsWtnNUY9wOzfNMIZUQVRI4koLvRpKi3Nr4Dbma/rNN7Gyd8axmCKBbnSJgdOuJ2EPm0g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1JkECkPpaiW0RJKUCEfjebkpOvSW6SfnlSwpKzod0ugIhANL/+Fxq70U4tqrKRE4HOmxSh/bqcRWricc6qyg25EL0"}]},"_from":".","_npmVersion":"1.3.5","_npmUser":{"name":"mattinsler","email":"matt.insler@gmail.com"},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}]}},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"time":{"modified":"2022-06-13T05:22:57.922Z","created":"2011-08-12T07:12:53.756Z","0.1.0":"2011-08-12T07:12:53.944Z","0.1.1":"2011-08-12T07:31:22.837Z","0.1.2":"2011-08-12T07:45:47.524Z","0.1.3":"2011-08-12T08:08:04.889Z","0.1.4":"2011-08-15T13:19:39.859Z","0.1.5":"2011-08-16T07:15:55.903Z","0.1.6":"2011-08-18T06:25:12.570Z","0.1.7":"2011-08-18T06:32:40.366Z","0.1.8":"2011-08-18T07:11:31.639Z","0.1.9":"2011-08-18T07:48:59.974Z","0.1.10":"2011-08-18T07:52:22.299Z","0.1.11":"2011-08-18T08:03:51.796Z","0.1.12":"2011-08-18T08:06:36.508Z","0.1.13":"2011-08-18T08:09:44.076Z","0.1.14":"2011-09-07T03:38:59.956Z","0.1.15":"2011-09-07T04:28:19.764Z","0.1.16":"2011-10-11T05:21:47.526Z","0.1.17":"2011-10-11T05:27:25.167Z","0.1.18":"2011-10-11T05:29:09.358Z","0.1.19":"2011-10-16T19:56:08.750Z","0.1.20":"2011-10-20T04:57:10.556Z","0.1.21":"2011-10-22T06:39:10.377Z","0.1.22":"2011-10-22T07:01:27.190Z","0.1.23":"2011-10-23T23:56:43.752Z","0.1.24":"2011-10-26T05:33:25.214Z","0.1.25":"2011-10-28T06:55:08.521Z","0.1.26":"2011-11-20T07:15:41.210Z","0.1.27":"2011-11-20T08:39:06.989Z","0.1.28":"2011-11-21T07:50:53.446Z","0.1.29":"2011-12-29T02:43:38.495Z","0.2.0":"2012-01-02T08:58:23.410Z","0.1.30":"2012-01-17T06:08:47.793Z","0.1.31":"2012-02-06T23:28:57.313Z","0.1.32":"2012-02-07T21:06:19.609Z","0.1.33":"2012-02-08T22:26:30.407Z","0.1.34":"2012-04-06T21:13:33.382Z","0.1.35":"2012-04-06T23:59:35.920Z","0.1.36":"2012-04-09T03:00:48.402Z","0.1.37":"2012-04-16T03:04:32.213Z","0.1.38":"2012-05-08T09:13:52.332Z","0.1.39":"2012-05-15T08:58:39.405Z","0.1.40":"2012-05-15T09:02:38.802Z","0.1.41":"2012-05-30T23:04:32.756Z","0.1.42":"2012-05-30T23:37:39.542Z","0.1.43":"2012-05-31T22:43:36.977Z","0.1.44":"2012-06-01T01:13:36.699Z","0.1.45":"2012-06-01T11:20:02.162Z","0.1.46":"2012-06-07T06:41:35.629Z","0.1.47":"2012-06-15T21:29:15.273Z","0.1.48":"2012-06-24T08:15:02.197Z","0.1.49":"2012-06-27T10:55:40.005Z","0.1.50":"2012-06-27T22:38:36.839Z","0.1.51":"2012-07-25T23:36:09.589Z","0.1.52":"2012-08-31T10:21:04.875Z","0.1.53":"2012-09-04T06:13:40.449Z","0.1.54":"2012-09-11T01:00:05.031Z","0.1.55":"2012-10-01T10:37:30.109Z","0.1.56":"2012-10-08T11:02:17.713Z","0.1.57":"2012-10-26T02:41:10.630Z","0.1.58":"2012-11-28T04:03:47.496Z","0.1.59":"2012-12-16T07:01:50.541Z","0.1.60":"2013-03-14T23:12:13.845Z","0.1.61":"2013-04-28T06:52:20.400Z","0.1.62":"2013-05-17T19:12:14.991Z","0.1.63":"2013-06-06T21:22:43.827Z","0.1.64":"2013-07-18T22:57:08.253Z","0.1.65":"2013-08-09T08:20:05.776Z"},"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"repository":{"type":"git","url":"git@github.com:mattinsler/caboose.git"},"users":{"fgribreau":true}}