<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>Rakefile</filename>
    </added>
    <added>
      <filename>public/app/lib/extensions.js</filename>
    </added>
    <added>
      <filename>public/assets/behaviour/vendor/diff_match_patch.js</filename>
    </added>
    <added>
      <filename>public/assets/behaviour/vendor/jsspec.js</filename>
    </added>
    <added>
      <filename>public/assets/style/vendor/jsspec.css</filename>
    </added>
    <added>
      <filename>public/vendor/mootools-trunk-1516.js</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,2 +1 @@
-/make.rb
-/make.rb.gz
+/public/coverage</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1,12 @@
-var ThreadController = new Controller($('#thread'), {});
\ No newline at end of file
+var ThreadController = new Class({
+    Extends: Controller,
+    options: {
+        controls: {
+            '.threaditem': {
+                click: function () {
+                    alert(&quot;I was clicked!&quot;);
+                }
+            }
+        }
+    }
+});</diff>
      <filename>public/app/controllers/thread_controller.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,6 @@
-include('../../vendor/ejs/ejs');
-
 var Controller = new Class({
     Implements: [Options, Events],
     options: {
-        binding: this,
         autoAttach: true,
         events: {
             initialized: function (controller) {
@@ -11,14 +8,18 @@ var Controller = new Class({
                     controller.attachAll();
                 }
             }
-        }
+        },
+        controls: {}
     },
-    initialize: function (element, controls, options) {
+    initialize: function (element, options, binding) {
         this.setOptions(options);
         this.element = element;
-        this.controls = $H(controls);
-        this.binding = this.options.binding;
-        this.added = new Hash();
+        this.controls = $H(this.options.controls);
+        if (binding) {
+            this.binding = binding;
+        } else {
+            this.binding = this;
+        }
         this.addEvents(this.options.events);
         this.fireEvent(&quot;initialized&quot;, this);
     },
@@ -26,6 +27,7 @@ var Controller = new Class({
         this.controls.each(function (v, k) {
             var entry = this.controls.get(k);
             if (entry &amp;&amp; !entry.noauto) {
+                console.debug(&quot;Attaching to %o&quot;, k)
                 this.attach(k, forceRebind);
             }
         },
@@ -33,7 +35,7 @@ var Controller = new Class({
     },
     attach: function (selectorName, forceRebind) {
         var elements;
-        this.controls.each(function (controls, selector) {
+        this.controls.each(function attachToSelector (controls, selector) {
             // Bind all appropriate events, so if we have &quot;.sel1 .sel2&quot; in
             // this.controls, calling with &quot;.sel1&quot; will include it.
             if (selectorName) {
@@ -47,16 +49,23 @@ var Controller = new Class({
             elements = this.element.getElements(selector);
 
             // Bind to this.element if selector == 'self'
-            if (elements.length === 0 &amp;&amp; selector === &quot;self&quot;) {
-                elements = [this.element];
+            if (elements.length === 0) {
+                if (selector === 'self') {
+                    elements = [this.element];
+                } else {
+                    console.warn(&quot;Found no elements matching &quot;, selector);
+                }
             }
 
-            elements.each(function (elem) {
-                if (!this.added[elem]) {
-                    this.added[elem] = [];
+            elements.each(function attachToElem (elem) {
+                console.debug(&quot;Attaching events to %o.&quot;, elem)
+                if (!elem.retrieve('controller:events')) {
+                    elem.store('controller:events', []);
                 }
+
                 $H(controls).each(function (fn, evName) {
-                    if (this.added[elem].contains(evName) &amp;&amp; !forceRebind) {
+                    if (elem.retrieve('controller:events').contains(fn) &amp;&amp; !forceRebind) {
+                        console.warn(&quot;Not rebinding %o with added = %o&quot;, elem, elem.retrieve('controller:events'));
                         return;
                     } else {
                         // Don't try and bind a boolean value.
@@ -65,7 +74,7 @@ var Controller = new Class({
                         }
 
                         elem.addEvent(evName, fn.bind(this.binding));
-                        this.added[elem].push(evName);
+                        elem.retrieve('controller:events').push(fn);
                     }
                 },
                 this);
@@ -78,7 +87,22 @@ var Controller = new Class({
     },
     // Name is relative to app/views directory, without an .ejs extension.
     renderView: function (name, data) {
-        return new EJS({url: '/app/views/'+name+'.ejs'}).render(data)
+        return new EJS({url: '/app/views/'+name+'.ejs'}).render(data);
+    },
+    renderViewTo: function(elem, name, data) {
+        return new Element('div', {html: this.renderView(name, data)}).getFirst().replaces(elem);
+    },
+    getElement: function () {
+        return this.element.getElement.run(arguments, this.element);
+    },
+    waitFor: function (elem, fn) {
+        var ii, domElem = this.getElement(elem);
+        while (!domElem &amp;&amp; ii &lt;= 20) {
+            ii += 1;
+            domElem = this.getElement.delay(100, this, elem);
+        }
+        // TODO: cope with failure of the above.
+        fn.run(domElem, this);
     }
 });
 </diff>
      <filename>public/app/lib/controller.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,34 @@
+Request.JSON.RESTful = new Class({
+    Extends: Request.JSON,
+    initialize: function (model, objectId, options) {
+        this.parent(options);
+        this.model = model;
+        this.objectId = objectId;
+    },
+    callback: function (fn, binding) {
+        this.addEvent('onFailure', function (responseObject, responseText) {
+            // TODO: actually FAIL!
+            this.model.requestFailureCallback(this.options.method,
+                                              this.objectId,
+                                              responseObject,
+                                              responseText);
+            fn.bind(binding)();
+        });
+        this.addEvent('onSuccess', function (responseObject, responseText) {
+            this.model.requestSuccessCallback(this.options.method,
+                                              this.objectId,
+                                              responseObject,
+                                              responseText);
+            fn.bind(binding)();
+        });
+        return this;
+    }
+});
+
 var Model = new Class({
     Implements: [Options, Events],
     options: {
         baseurl: '/api/rest',
-        name: 'dummy',
         events: {
             //requestSent: $empty,
             //requestCompleted: $empty,
@@ -10,51 +36,52 @@ var Model = new Class({
             //requestFailure: $empty
             }
     },
-    initialize: function (options) {
+    initialize: function (name, options) {
         this.setOptions(options);
+        this.name = name;
+        this.requests = [];
         this.registry = [];
         this.entities = new Hash();
         this.addEvents(this.options.events);
     },
+    returnMe: function () {
+        return this;
+    },
     registerGet: function () {
-        this.request('get').send();
+        return this.request('get');
     },
     registerPost: function (entity) {
-        this.request('post').send(entity);
+        return this.request('post');
     },
     entityGet: function (id) {
-        this.request('get', id).send();
+        return this.request('get', id);
     },
-    entityPut: function (id, entity) {
-        this.request('put', id).send(entity);
+    entityPut: function (id) {
+        //return this.request('put', id);
+        return this.request('post', id);
     },
     entityDelete: function (id) {
-        this.request('delete', id).send();
+        //return this.request('delete', id);
+        return this.request('post', id);
     },
     request: function (reqMethod, id) {
-        var reqUrl = [this.options.baseurl, this.options.name, id].clean().join('/');
-        return new Request.JSON({
-            method: reqMethod,
+        var reqUrl = [this.options.baseurl, this.name, id].clean().join('/');
+        return new Request.JSON.RESTful(this, id, {
             url: reqUrl,
+            method: reqMethod,
             // Do sanity checking of JSON?
             secure: true,
-            // Fake PUT and DELETE requests (see MooTool source for details)?
+            // Fake PUT and DELETE requests? (see MooTools source for details)
             emulation: false,
             // Async callback methods:
             onRequest: this.fireEvent.bind(this, ['requestSent']),
-            onComplete: this.fireEvent.bind(this, ['requestCompleted']),
-            onSuccess: (function (responseObject, responseText) {
-                this.requestSuccessCallback(reqMethod, id, responseObject, responseText);
-            }).bind(this),
-            onFailure: (function (responseObject, responseText) {
-                this.requestFailureCallback(reqMethod, id, responseObject, responseText);
-            }).bind(this)
+            onComplete: this.fireEvent.bind(this, ['requestCompleted'])
         });
     },
     requestSuccessCallback: function (reqMethod, id, responseObject, responseText) {
         switch (reqMethod) {
         case 'get':
-            if (id !== null &amp;&amp; id !== undefined) {
+            if ($chk(id)) {
                 // entityGet
                 this.registry.include(id);
                 this.entities[id] = responseObject;
@@ -77,6 +104,9 @@ var Model = new Class({
             // entityDelete
             this.registry.erase(id);
             this.entities.erase(id);
+            break;
+        default:
+            break;
         }
         this.fireEvent('requestSuccess');
     },</diff>
      <filename>public/app/lib/model.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,16 @@
-include('lib/model',
-        'lib/controller',
-        'models/factlet',
-        'models/thread',
-        'controllers/thread_controller');
+/* An example master.js for a site in which every element
+   with class &quot;thread&quot; has its behaviour controlled by a
+   ThreadController controller. */
 
 window.addEvent('domready', function () {
-});
\ No newline at end of file
+
+    $$('.thread').each(function (elem) {
+        var t = new ThreadController(elem);
+
+        // I've found the following to be really quite
+        // useful when keeping track of controllers.
+        elem.store(&quot;thread:controller&quot;, t);
+    });
+
+});
+</diff>
      <filename>public/app/master.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1 @@
-var Thread = new Model({
-    name: 'thread'
-});
\ No newline at end of file
+var Thread = new Model('thread');</diff>
      <filename>public/app/models/thread.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,21 +1,41 @@
 
 &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
 &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
-&lt;head&gt;
+  &lt;head&gt;
     &lt;title&gt;Microfacts Specs&lt;/title&gt;
     &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;/&gt;
-    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../assets/style/jsspec.css&quot; /&gt;
-    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../vendor/include.js&quot;&gt;&lt;/script&gt;
+    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../assets/style/vendor/jsspec.css&quot; /&gt;
+    
     &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-        include.set_path('..')
-        include('vendor/mootools-trunk-1515',
-                'coverage/master',
-                'assets/behaviour/jsspec',
-                'assets/behaviour/diff_match_patch',
-                'spec/lib/controller_spec',
-                'spec/lib/model_spec')
+      // Let's not throw a tantrum if the browser doesn't have a console to write to.
+      if (!window.console || !console.firebug) {
+          var names = [&quot;log&quot;, &quot;debug&quot;, &quot;info&quot;, &quot;warn&quot;, &quot;error&quot;, &quot;assert&quot;, &quot;dir&quot;, &quot;dirxml&quot;, &quot;group&quot;, &quot;groupEnd&quot;, &quot;time&quot;, &quot;timeEnd&quot;, &quot;count&quot;, &quot;trace&quot;, &quot;profile&quot;, &quot;profileEnd&quot;];
+
+          window.console = {};
+          for (var i = 0; i &lt; names.length; i += 1) {
+              window.console[names[i]] = function () {};
+          }
+      }
     &lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;/body&gt;
+    
+    &lt;!-- Vendoooooor stoof. --&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../vendor/mootools-trunk-1516.js&quot;&gt;&lt;/script&gt;
+    
+    &lt;!-- Load source files - to be tested. --&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../app/lib/extensions.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../app/lib/model.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../app/lib/controller.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../app/models/thread.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../app/controllers/thread_controller.js&quot;&gt;&lt;/script&gt;
+   
+    &lt;!-- Load JSSpec and associated stoof. --&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../assets/behaviour/vendor/jsspec.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../assets/behaviour/vendor/diff_match_patch.js&quot;&gt;&lt;/script&gt;
+    
+    &lt;!-- Load specs. --&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../spec/lib/controller_spec.js&quot;&gt;&lt;/script&gt;
+    &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;../spec/lib/model_spec.js&quot;&gt;&lt;/script&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+  &lt;/body&gt;
 &lt;/html&gt;
\ No newline at end of file</diff>
      <filename>public/spec/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -3,80 +3,105 @@ describe(&quot;Controller&quot;, {
         returns = [];
 
         elem = new Element('div', {
-            id: 'myControlledElement',
-            html: [ '&lt;span id=&quot;one&quot;&gt;span one&lt;/span&gt;',
-                    '&lt;span id=&quot;two&quot; class=&quot;common&quot;&gt;span two&lt;/span&gt;',
-                    '&lt;span id=&quot;three&quot; class=&quot;common&quot;&gt;span three&lt;/span&gt;' ]
+            'class': 'myControlledElement',
+            html: [ '&lt;span class=&quot;one&quot;&gt;span one&lt;/span&gt;',
+                    '&lt;span class=&quot;two common&quot;&gt;span two&lt;/span&gt;',
+                    '&lt;span class=&quot;three common&quot;&gt;span three&lt;/span&gt;' ]
         });
-        
+
         // We need the element in the DOM to be able to search it.
         elem.setStyle('display', 'none');
         elem.inject(document.getElement('body'));
-        
-        spanOne = elem.getElement('#one');
-        spanTwo = elem.getElement('#two');
-        spanThree = elem.getElement('#three');
 
-        c = new Controller(elem, {
-            'self': {
-                parentElementEvent: function () {
-                    returns.push(&quot;#myControlledElement: parentElementEvent&quot;);
-                }
-            },
-            '#one': {
-                eventTheFirst: function () {
-                    returns.push(&quot;#one: eventTheFirst&quot;);
-                }
-            },
-            '#two': {
-                noauto: true,
-                controlsAdded: function () {
-                    returns.push(&quot;#two: controlsAdded&quot;);
-                }
-            },
-            'span': {
-                threeCalls: function () {
-                    returns.push(&quot;span: threeCalls&quot;);
-                }
-            },
-            '.common': {
-                twoCalls: function (param) {
-                    returns.push(&quot;.common: twoCalls(&quot; + param + &quot;)&quot;)
+        MyController = new Class({
+            Extends: Controller,
+            options: {
+                controls: {
+                    'self': {
+                        parentElementEvent: function () {
+                            returns.push(&quot;.myControlledElement: parentElementEvent&quot;);
+                        }
+                    },
+                    '.one': {
+                        eventTheFirst: function () {
+                            returns.push(&quot;.one: eventTheFirst&quot;);
+                        }
+                    },
+                    '.two': {
+                        noauto: true,
+                        controlsAdded: function () {
+                            returns.push(&quot;.two: controlsAdded&quot;);
+                        }
+                    },
+                    '.three': {
+                        bindingTest: function () {
+                            returns.push(this.name);
+                        }
+                    },
+                    'span': {
+                        threeCalls: function () {
+                            returns.push(&quot;span: threeCalls&quot;);
+                        }
+                    },
+                    '.common': {
+                        twoCalls: function (param) {
+                            returns.push(&quot;.common: twoCalls(&quot; + param + &quot;)&quot;)
+                        }
+                    }
                 }
             }
         });
+        c = new MyController(elem);
+    },
+    after_each: function () {
+        elem.dispose();
+        try {
+            elem2.dispose();
+        } catch(e) {}
     },
    'should attach its controls\' events in its element when instantiated by default': function () {
-       spanOne.fireEvent('eventTheFirst');
-       expect(returns).should_be([&quot;#one: eventTheFirst&quot;]);
+       elem.getElement('.one').fireEvent('eventTheFirst');
+       expect(returns).should_be([&quot;.one: eventTheFirst&quot;]);
    },
-   'should not attach its controls\' events by default when instantiatied with option autoAttach: false': function () {
-       newElem = elem.clone(true, true);
-       newElem.inject(document.getElement('body'));
-       newSpanOne = newElem.getElement('#one');
-       d = new Controller(newElem, c.controls, {autoAttach: false});
-       newSpanOne.fireEvent('eventTheFirst');
+   'should not attach its controls\' events by default when instantiatied with option autoAttach: false': function () {       
+       elem2 = elem.clone();
+       d = new MyController(elem2, {autoAttach: false});
+       elem2.getElement('.one').fireEvent('eventTheFirst');
        expect(returns).should_be_empty();
    },
    'should not attach a controls\' events if noauto is set to true within a selector\'s events list': function () {
        expect(returns).should_be_empty();
    },
    'should not attach events twice (i.e. attachAll called a second time should do nothing)': function () {
-       c.attachAll()
-       spanOne.fireEvent('eventTheFirst');
-       expect(returns).should_be([&quot;#one: eventTheFirst&quot;]);
+       c.attachAll();
+       elem.getElement('.one').fireEvent('eventTheFirst');
+       expect(returns).should_be([&quot;.one: eventTheFirst&quot;]);
    },
    'should attach events twice if forceRebind is set': function () {
-       c.attachAll(true)
-       spanOne.fireEvent('eventTheFirst');
-       expect(returns).should_be([&quot;#one: eventTheFirst&quot;, &quot;#one: eventTheFirst&quot;]);
+       c.attachAll(true);
+       elem.getElement('.one').fireEvent('eventTheFirst');
+       expect(returns).should_be([&quot;.one: eventTheFirst&quot;, &quot;.one: eventTheFirst&quot;]);
    },
    'should bind events to its element using the special selector &quot;self&quot;': function () {
        elem.fireEvent('parentElementEvent');
-       expect(returns).should_be([&quot;#myControlledElement: parentElementEvent&quot;]);
+       expect(returns).should_be([&quot;.myControlledElement: parentElementEvent&quot;]);
    },
    'should automatically fire controlsAdded on an element when it successfully attaches events to an elementset': function () {
-       c.attach('#two');
-       expect(returns).should_be([&quot;#two: controlsAdded&quot;]);
+       c.attach('.two');
+       expect(returns).should_be([&quot;.two: controlsAdded&quot;]);
+   },
+   'should bind event functions to itself by default': function () {
+       c.name = &quot;MyControllerName&quot;;
+       elem.getElement('.three').fireEvent('bindingTest');
+       expect(returns).should_be([c.name]);
+   },
+   'should bind event functions to the object specified on construction if it exists': function () {
+       elem2 = elem.clone();
+       binding = {
+           name: &quot;AnotherControllerName&quot;
+       };
+       d = new MyController(elem2, {}, binding);
+       elem2.getElement('.three').fireEvent('bindingTest');
+       expect(returns).should_be([binding.name]);
    }
 });
\ No newline at end of file</diff>
      <filename>public/spec/lib/controller_spec.js</filename>
    </modified>
    <modified>
      <diff>@@ -29,26 +29,24 @@ describe('Model', {
                 name: &quot;three&quot;
             }]
         ];
-        Factlet = new Model({
-            baseurl: 'http://localhost:5000/api/rest',
-            name: 'factlet'
+        Factlet = new Model('factlet', {
+            baseurl: 'http://localhost:5000/api/rest'
         });
-        Thread = new Model({
-            baseurl: 'http://localhost:5000/api/rest',
-            name: 'thread'
+        Thread = new Model('thread', {
+            baseurl: 'http://localhost:5000/api/rest'
         });
-        Mock = new Model({});
+        Mock = new Model('mock');
     },
     // TODO: can't really test this properly until we have a fixtures library.
     'should fill its registry with a list of model objects from registerGet': function () {
-        Factlet.registerGet();
+        Factlet.registerGet().send();
         expect(Factlet.registry).should_not_be_null();
         expect($type(Factlet.registry)).should_be('array');
     },
-    
-    // Until the above is fixed: call the callbacks directly, skipping out the 
+
+    // Until the above is fixed: call the callbacks directly, skipping out the
     // server call.
-    
+
     // requestSuccessCallback: function (reqMethod, id, responseObject, responseText)
     'should process a GET without an id as a registerGet call': function () {
         Mock.requestSuccessCallback('get', null, mockData[0]);
@@ -81,5 +79,5 @@ describe('Model', {
         expect(Mock.entities.getClean()).should_be({});
         expect(Mock.registry).should_be_empty();
     }
-    
+
 });
\ No newline at end of file</diff>
      <filename>public/spec/lib/model_spec.js</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>Rantfile</filename>
    </removed>
    <removed>
      <filename>public/app/models/factlet.js</filename>
    </removed>
    <removed>
      <filename>public/assets/behaviour/diff_match_patch.js</filename>
    </removed>
    <removed>
      <filename>public/assets/behaviour/jsspec.js</filename>
    </removed>
    <removed>
      <filename>public/assets/style/jsspec.css</filename>
    </removed>
    <removed>
      <filename>public/coverage/controllers/thread_controller.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/controllers/thread_controller.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/controllers/thread_controller.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage-sh_javascript.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage-sh_main.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage-sh_nedit.css</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage-throbber.gif</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage.css</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/controller.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/controller.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/controller.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/model.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/model.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/lib/model.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/master.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/master.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/master.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/factlet.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/factlet.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/factlet.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/thread.js</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/thread.js.jscoverage.html</filename>
    </removed>
    <removed>
      <filename>public/coverage/models/thread.js.jscoverage.js</filename>
    </removed>
    <removed>
      <filename>public/index.html</filename>
    </removed>
    <removed>
      <filename>public/vendor/compress.html</filename>
    </removed>
    <removed>
      <filename>public/vendor/compress.js</filename>
    </removed>
    <removed>
      <filename>public/vendor/include.js</filename>
    </removed>
    <removed>
      <filename>public/vendor/mootools-trunk-1515.js</filename>
    </removed>
    <removed>
      <filename>script/files_list.txt</filename>
    </removed>
    <removed>
      <filename>script/include.rb</filename>
    </removed>
    <removed>
      <filename>script/readme.txt</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>8c54c5854b34ee62e60aee19774cc762bd0f354b</id>
    </parent>
  </parents>
  <author>
    <name>Nick Stenning</name>
    <email>nick@whiteink.com</email>
  </author>
  <url>http://github.com/nickstenning/micromvc/commit/a6452646a996edbd22edb5ad85d0a35613cd692d</url>
  <id>a6452646a996edbd22edb5ad85d0a35613cd692d</id>
  <committed-date>2008-04-04T12:30:36-07:00</committed-date>
  <authored-date>2008-04-04T11:54:34-07:00</authored-date>
  <message>Clean up and backport from Microfacts</message>
  <tree>7d7fae7538ef075c004f00d3f7ec941f056b2ac4</tree>
  <committer>
    <name>Nick Stenning</name>
    <email>nick@whiteink.com</email>
  </committer>
</commit>
