<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>client/lib/screw/screw.js</filename>
    </added>
    <added>
      <filename>client/vendor/monarch_view.js</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <filename>bin/screw</filename>
    </modified>
    <modified>
      <diff>@@ -1,86 +1,26 @@
+//= require &lt;monarch_view&gt;
 //= require &lt;foundation&gt;
 //= require &lt;jquery-1.2.6&gt;
 //= require &lt;disco&gt;
 //= require &lt;jquery.print&gt;
 //= require &lt;json&gt;
 //= require &lt;prefs&gt;
-//= require &quot;screw/jquery_disco_compatibility&quot;
 
+
+
+//= require &quot;screw/screw&quot;
 //= require &quot;screw/keywords&quot;
 //= require &quot;screw/matchers&quot;
 //= require &quot;screw/context&quot;
 //= require &quot;screw/runnable_methods&quot;
-//= require &quot;screw/description&quot;
-//= require &quot;screw/example&quot;
-//= require &quot;screw/interface&quot;
-//= require &quot;screw/require&quot;
-//= require &quot;screw/subscription_node&quot;
-
-module(&quot;Screw&quot;, function(c) { with (c) {
-  def('Unit', function(specification) {
-    if (!this.shared_context) this.shared_context = new Screw.Context();
-    specification(this.shared_context);
-  });
-
-  def('root_description', function() {
-    return this._root_description = this._root_description || new Screw.Description(&quot;All specs&quot;);
-  });
-
-  def('mocks', []);
 
-  def('reset_mocks', function() {
-    Screw.each(Screw.mocks, function() {
-      this.mocked_object[this.function_name] = this.original_function;
-    })
-    Screw.mocks = [];
-  });
 
-  def('current_description', function() {
-    return this.description_stack()[this.description_stack().length - 1];
-  });
 
-  def('push_description', function(description) {
-    this.description_stack().push(description);
-  });
-
-  def('pop_description', function() {
-    var description = this.description_stack().pop();
-    this.current_description().add_description(description)
-  });
-
-  def('push_scenario', function(scenario_description) {
-    this.description_stack().push(scenario_description);
-  });
-
-  def('pop_scenario', function() {
-    var scenario_description = this.description_stack().pop();
-    this.current_description().add_scenario(scenario_description);
-  });
-
-  def('description_stack', function() {
-    if (!this._description_stack) {
-      this._description_stack = [this.root_description()];
-    }
-    return this._description_stack;
-  });
-
-  def('map', function(array, fn) {
-    var results = [];
-    Screw.each(array, function() {
-      results.push(fn.call(this));
-    });
-    return results;
-  })
+//= require &quot;screw/description&quot;
 
-  def('each', function(array, fn) {
-    for (var i = 0; i &lt; array.length; i++) {
-      fn.call(array[i]);
-    }
-  });
+//= require &quot;screw/jquery_disco_compatibility&quot;
 
-  def('reverse_each', function(array, fn) {
-    for (var i = array.length - 1; i &gt;= 0; i--) {
-      fn.call(array[i]);
-    }
-  });
-}});
+//= require &quot;screw/example&quot;
+//= require &quot;screw/interface&quot;
+//= require &quot;screw/require&quot;
+//= require &quot;screw/subscription_node&quot;</diff>
      <filename>client/lib/screw.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,5 @@
-module(&quot;Screw&quot;, function(c) { with (c) {
-  constructor(&quot;Context&quot;, function() {
-    include(Screw.Matchers);
-    include(Screw.Keywords);
-  });
-}});
+(function(Screw, Monarch, jQuery) {
+
+Monarch.constructor(&quot;Screw.Context&quot;, Screw.Matchers, Screw.Keywords);
+
+})(Screw, Monarch);</diff>
      <filename>client/lib/screw/context.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,200 +1,200 @@
-module(&quot;Screw&quot;, function(c) { with (c) {
-  constructor(&quot;Description&quot;, function() {
-    include(Screw.RunnableMethods);
-
-    def('initialize', function(name) {
-      this.name = name;
-      this.children = [];
-      this.child_descriptions = [];
-      this.examples = [];
-      this.inits = [];
-      this.befores = [];
-      this.afters = [];
-      this.example_completed_subscription_node = new Screw.SubscriptionNode();
-      this.has_scenario = false;
+(function(Screw, Monarch) {
+
+Monarch.constructor(&quot;Screw.Description&quot;, Screw.RunnableMethods, {
+  initialize: function(name) {
+    this.name = name;
+    this.children = [];
+    this.child_descriptions = [];
+    this.examples = [];
+    this.inits = [];
+    this.befores = [];
+    this.afters = [];
+    this.example_completed_subscription_node = new Screw.SubscriptionNode();
+    this.has_scenario = false;
+  },
+
+  clone: function() {
+    var clone = Screw.$.extend(new Screw.Description(), this);
+    clone.example_completed_subscription_node = new Screw.SubscriptionNode();
+    clone.children = [];
+    clone.child_descriptions = [];
+    clone.examples = [];
+
+    Screw.each(this.children, function() {
+      var child_clone = this.clone();
+      if (child_clone.constructor == Screw.Description) {
+        clone.add_description(child_clone);
+      } else {
+        clone.add_example(child_clone);
+      }
     });
 
-    def('clone', function() {
-      var clone = Screw.$.extend(new Screw.Description(), this);
-      clone.example_completed_subscription_node = new Screw.SubscriptionNode();
-      clone.children = [];
-      clone.child_descriptions = [];
-      clone.examples = [];
-      
-      Screw.each(this.children, function() {
-        var child_clone = this.clone();
-        if (child_clone.constructor == Screw.Description) {
-          clone.add_description(child_clone);
-        } else {
-          clone.add_example(child_clone);
-        }
-      });
+    return clone;
+  },
 
-      return clone; 
+  total_examples: function() {
+    var total_examples = this.examples.length;
+    Screw.each(this.child_descriptions, function() {
+      total_examples += this.total_examples();
+    })
+    return total_examples;
+  },
+
+  failed_examples: function() {
+    var failed_examples = [];
+    Screw.each(this.examples, function() {
+      if (this.failed) {
+        failed_examples.push(this);
+      }
     });
-
-    def('total_examples', function() {
-      var total_examples = this.examples.length;
-      Screw.each(this.child_descriptions, function() {
-        total_examples += this.total_examples();
-      })
-      return total_examples;
+    Screw.each(this.child_descriptions, function() {
+      failed_examples = failed_examples.concat(this.failed_examples());
     });
+    return failed_examples;
+  },
 
-    def('failed_examples', function() {
-      var failed_examples = [];
-      Screw.each(this.examples, function() {
-        if (this.failed) {
-          failed_examples.push(this);
-        }
-      });
-      Screw.each(this.child_descriptions, function() {
-        failed_examples = failed_examples.concat(this.failed_examples());
-      });
-      return failed_examples;
+  failure_messages: function() {
+    var messages = [];
+    Screw.each(this.failed_examples(), function() {
+      messages.push(this.failure_message);
     });
+    return messages;
+  },
 
-    def('failure_messages', function() {
-      var messages = [];
-      Screw.each(this.failed_examples(), function() {
-        messages.push(this.failure_message);
-      });
-      return messages;
+  runnable_at_path: function(path) {
+    var current_runnable = this;
+    Screw.each(path, function() {
+      current_runnable = current_runnable.children[this];
     });
+    return current_runnable;
+  },
 
-    def('runnable_at_path', function(path) {
-      var current_runnable = this;
-      Screw.each(path, function() {
-        current_runnable = current_runnable.children[this];
-      });
-      return current_runnable;
-    })
+  add_description: function(description) {
+    if (this.has_scenarios) {
+      this.add_description_to_scenarios(description);
+    } else {
+      this.add_child_description_or_scenario(description)
+    }
+  },
 
-    def('add_description', function(description) {
-      if (this.has_scenarios) {
-        this.add_description_to_scenarios(description);
-      } else {
-        this.add_child_description_or_scenario(description)
-      }
+  add_description_to_scenarios: function(description) {
+    this.scenario_child_descriptions.push(description);
+    Screw.each(this.child_descriptions, function() {
+      this.add_description(description.clone());
     });
+  },
 
-    def('add_description_to_scenarios', function(description) {
-      this.scenario_child_descriptions.push(description);
-      Screw.each(this.child_descriptions, function() {
-        this.add_description(description.clone());
-      });
+  add_scenario: function(scenario_description) {
+    if (!this.has_scenarios) {
+      this.scenario_examples = this.examples;
+      this.scenario_child_descriptions = this.child_descriptions;
+      this.children = [];
+      this.child_descriptions = [];
+      this.examples = [];
+      this.has_scenarios = true;
+    }
+
+    Screw.each(this.scenario_examples, function() {
+      scenario_description.add_example(this.clone());
+    });
+    Screw.each(this.scenario_child_descriptions, function() {
+      scenario_description.add_description(this.clone());
     });
 
-    def('add_scenario', function(scenario_description) {
-      if (!this.has_scenarios) {
-        this.scenario_examples = this.examples;
-        this.scenario_child_descriptions = this.child_descriptions;
-        this.children = [];
-        this.child_descriptions = [];
-        this.examples = [];
-        this.has_scenarios = true;
-      }
+    this.add_child_description_or_scenario(scenario_description);
+  },
 
-      Screw.each(this.scenario_examples, function() {
-        scenario_description.add_example(this.clone());
-      });
-      Screw.each(this.scenario_child_descriptions, function() {
-        scenario_description.add_description(this.clone());
-      });
-      
-      this.add_child_description_or_scenario(scenario_description);
+  add_child_description_or_scenario: function(description) {
+    var self = this;
+    description.parent_description = this;
+    description.index = this.children.length;
+    this.children.push(description);
+    this.child_descriptions.push(description);
+    description.on_example_completed(function(example) {
+      self.example_completed_subscription_node.publish(example);
     });
+  },
 
-    def('add_child_description_or_scenario', function(description) {
+  add_example: function(example) {
+    if (this.has_scenarios) {
+      this.add_example_to_scenarios(example);
+    } else {
       var self = this;
-      description.parent_description = this;
-      description.index = this.children.length;
-      this.children.push(description);
-      this.child_descriptions.push(description);
-      description.on_example_completed(function(example) {
+      example.parent_description = this;
+      example.index = this.children.length;
+      this.children.push(example);
+      this.examples.push(example);
+
+      example.on_example_completed(function(example) {
         self.example_completed_subscription_node.publish(example);
       });
-    });
+    }
+  },
 
-    def('add_example', function(example) {
-      if (this.has_scenarios) {
-        this.add_example_to_scenarios(example);
-      } else {
-        var self = this;
-        example.parent_description = this;
-        example.index = this.children.length;
-        this.children.push(example);
-        this.examples.push(example);
-
-        example.on_example_completed(function(example) {
-          self.example_completed_subscription_node.publish(example);
-        });
-      }
+  add_example_to_scenarios: function(example) {
+    this.scenario_examples.push(example);
+    Screw.each(this.child_descriptions, function() {
+      this.add_example(example.clone());
     });
+  },
 
-    def('add_example_to_scenarios', function(example) {
-      this.scenario_examples.push(example);
-      Screw.each(this.child_descriptions, function() {
-        this.add_example(example.clone());
-      });
-    });
+  add_init: function(fn) {
+    this.inits.push(fn);
+  },
 
-    def('add_init', function(fn) {
-      this.inits.push(fn);
-    });
+  add_before: function(fn) {
+    this.befores.push(fn);
+  },
 
-    def('add_before', function(fn) {
-      this.befores.push(fn);
-    });
+  add_after: function(fn) {
+    this.afters.push(fn);
+  },
 
-    def('add_after', function(fn) {
-      this.afters.push(fn);
-    });
+  enqueue: function() {
+    var enqueue_it = function() {
+      this.enqueue()
+    };
+    Screw.each(this.examples, enqueue_it);
+    Screw.each(this.child_descriptions, enqueue_it);
+  },
 
-    def('enqueue', function() {
-      var enqueue_it = function() {
-        this.enqueue()
-      };
-      Screw.each(this.examples, enqueue_it);
-      Screw.each(this.child_descriptions, enqueue_it);
-    });
+  run: function() {
+    var run_it = function() {
+      this.run()
+    };
+    Screw.each(this.examples, run_it);
+    Screw.each(this.child_descriptions, run_it);
+  },
+
+  run_inits: function(example_context) {
+    if (this.parent_description) {
+      this.parent_description.run_inits(example_context);
+    }
 
-    def('run', function() {
-      var run_it = function() {
-        this.run()
-      };
-      Screw.each(this.examples, run_it);
-      Screw.each(this.child_descriptions, run_it);
+    Screw.each(this.inits, function() {
+      this.call(example_context);
     });
+  },
 
-    def('run_inits', function(example_context) {
-      if (this.parent_description) {
-        this.parent_description.run_inits(example_context);
-      }
+  run_befores: function(example_context) {
+    if (this.parent_description) {
+      this.parent_description.run_befores(example_context);
+    }
 
-      Screw.each(this.inits, function() {
-        this.call(example_context);
-      });
+    Screw.each(this.befores, function() {
+      this.call(example_context);
     });
+  },
 
-    def('run_befores', function(example_context) {
-      if (this.parent_description) {
-        this.parent_description.run_befores(example_context);
-      }
-
-      Screw.each(this.befores, function() {
-        this.call(example_context);
-      });
+  run_afters: function(example_context) {
+    Screw.each(this.afters, function() {
+      this.call(example_context);
     });
 
-    def('run_afters', function(example_context) {
-      Screw.each(this.afters, function() {
-        this.call(example_context);
-      });
+    if (this.parent_description) {
+      this.parent_description.run_afters(example_context);
+    }
+  }
+});
 
-      if (this.parent_description) {
-        this.parent_description.run_afters(example_context);
-      }
-    });
-  });
-}});
+})(Screw, Monarch);</diff>
      <filename>client/lib/screw/description.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,12 @@
 module(&quot;Screw&quot;, function(c) { with(c) {
 }});
 
-Screw.$ = jQuery.noConflict(true);
-delete window.jQuery;
-delete window.$;
+Screw.$ = jQuery;
+Screw.jQuery = jQuery;
+jQuery.noConflict(true);
+
+Screw.Monarch = window.Monarch;
+delete window.Monarch;
 
 Screw.Disco = window.Disco;
 delete window.Disco;</diff>
      <filename>client/lib/screw/jquery_disco_compatibility.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,121 +1,130 @@
-module(&quot;Screw&quot;, function(c) { with (c) {
-  module(&quot;Keywords&quot;, function() {
-    def('describe', function(name, fn) {
-      Screw.push_description(new Screw.Description(name));
-      fn();
-      Screw.pop_description();
-    });
-
-    def('context', Screw.Keywords.describe);
-
-    def('scenario', function(name, fn) {
-      Screw.push_scenario(new Screw.Description(name));
-      fn();
-      Screw.pop_scenario();
-    })
-
-    def('it', function(name, fn) {
-      Screw.current_description().add_example(new Screw.Example(name, fn));
-    });
-
-    def('specify', Screw.Keywords.it);
-    def('they', Screw.Keywords.it);
-
-    def('before', function(fn) {
-      Screw.current_description().add_before(fn);
-    });
-
-    def('init', function(fn) {
-      Screw.current_description().add_init(fn);
-    });
-
-    def('after', function(fn) {
-      Screw.current_description().add_after(fn);
-    });
-
-    def('expect', function(actual) {
-      var funcname = function(f) {
-          var s = f.toString().match(/function (\w*)/)[1];
-          if ((s == null) || (s.length == 0)) return &quot;anonymous&quot;;
-          return s;
-      };
-
-      var stacktrace = function() {
-          var s = &quot;&quot;;
-          for(var a = arguments.caller; a != null; a = a.caller) {
-              s += funcname(a.callee) + &quot;\n&quot;;
-              if (a.caller == a) break;
-          }
-          return s;
-      };
-
-      return {
-        to: function(matcher, expected, not) {
-          var matched = matcher.match(expected, actual);
-          if (not ? matched : !matched) {
-            throw(new Error(matcher.failure_message(expected, actual, not)));
-          }
-        },
-
-        to_not: function(matcher, expected) {
-          this.to(matcher, expected, true);
-        }
+(function(Screw, Monarch) {
+
+Monarch.module(&quot;Screw.Keywords&quot;, {
+  describe: function(name, fn) {
+    Screw.push_description(new Screw.Description(name));
+    fn();
+    Screw.pop_description();
+  },
+
+  context: function(name, fn) {
+    this.describe(name, fn);
+  },
+
+  scenario: function(name, fn) {
+    Screw.push_scenario(new Screw.Description(name));
+    fn();
+    Screw.pop_scenario();
+  },
+
+  it: function(name, fn) {
+    Screw.current_description().add_example(new Screw.Example(name, fn));
+  },
+
+  specify: function(name, fn) {
+    this.it(name, fn);
+  },
+
+  they: function(name, fn) {
+    this.it(name, fn);
+  },
+
+  before: function(fn) {
+    Screw.current_description().add_before(fn);
+  },
+
+  init: function(fn) {
+    Screw.current_description().add_init(fn);
+  },
+
+  after: function(fn) {
+    Screw.current_description().add_after(fn);
+  },
+
+  expect: function(actual) {
+    var funcname = function(f) {
+      var s = f.toString().match(/function (\w*)/)[1];
+      if ((s == null) || (s.length == 0)) return &quot;anonymous&quot;;
+      return s;
+    };
+
+    var stacktrace = function() {
+      var s = &quot;&quot;;
+      for(var a = arguments.caller; a != null; a = a.caller) {
+        s += funcname(a.callee) + &quot;\n&quot;;
+        if (a.caller == a) break;
       }
-    });
+      return s;
+    };
+
+    return {
+      to: function(matcher, expected, not) {
+        var matched = matcher.match(expected, actual);
+        if (not ? matched : !matched) {
+          throw(new Error(matcher.failure_message(expected, actual, not)));
+        }
+      },
 
-    def('mock', function(object, method_name, method_mock) {
-      if (!object[method_name]) {
-        throw new Error(&quot;in mock_function: &quot; + method_name + &quot; is not a function that can be mocked&quot;);
+      to_not: function(matcher, expected) {
+        this.to(matcher, expected, true);
       }
-      var mock_function = this.mock_function(method_mock);
-      mock_function.mocked_object = object;
-      mock_function.function_name = method_name;
-      mock_function.original_function = object[method_name];
-      Screw.mocks.push(mock_function);
-      object[method_name] = mock_function;
-
-      return object;
-    });
-
-    def('mock_function', function() {
-      var fn_to_call, function_name;
-
-      if (arguments.length == 2) {
+    }
+  },
+
+  mock: function(object, method_name, method_mock) {
+    if (!object[method_name]) {
+      throw new Error(&quot;in mock_function: &quot; + method_name + &quot; is not a function that can be mocked&quot;);
+    }
+    var mock_function = this.mock_function(method_mock);
+    mock_function.mocked_object = object;
+    mock_function.function_name = method_name;
+    mock_function.original_function = object[method_name];
+    Screw.mocks.push(mock_function);
+    object[method_name] = mock_function;
+
+    return object;
+  },
+
+  mock_function: function() {
+    var fn_to_call, function_name;
+
+    if (arguments.length == 2) {
+      function_name = arguments[0];
+      fn_to_call = arguments[1];
+    } else if (arguments.length == 1) {
+      if (typeof arguments[0] == &quot;function&quot;) {
+        fn_to_call = arguments[0];
+      } else {
         function_name = arguments[0];
-        fn_to_call = arguments[1];
-      } else if (arguments.length == 1) {
-        if (typeof arguments[0] == &quot;function&quot;) {
-          fn_to_call = arguments[0];
-        } else {
-          function_name = arguments[0];
-        }
       }
+    }
 
-      function_name = function_name || &quot;mock function&quot;;
+    function_name = function_name || &quot;mock function&quot;;
 
-      var mock_function = function() {
-        var args_array = Array.prototype.slice.call(arguments)
-        mock_function.call_count += 1;
-        mock_function.this_values.push(this);
-        mock_function.most_recent_this_value =  this;
-        mock_function.call_args.push(args_array);
-        mock_function.most_recent_args = args_array;
+    var mock_function = function() {
+      var args_array = Array.prototype.slice.call(arguments)
+      mock_function.call_count += 1;
+      mock_function.this_values.push(this);
+      mock_function.most_recent_this_value =  this;
+      mock_function.call_args.push(args_array);
+      mock_function.most_recent_args = args_array;
 
-        if (fn_to_call) {
-          return fn_to_call.apply(this, args_array);
-        }
-      };
-
-      mock_function.function_name = function_name;
-      mock_function.clear = function() {
-        this.call_count = 0;
-        this.call_args = [];
-        this.this_values = [];
-        this.most_recent_args = null;
-        this.most_recent_this_value = null;
+      if (fn_to_call) {
+        return fn_to_call.apply(this, args_array);
       }
-      mock_function.clear();
-      return mock_function;
-    });
-  });
-}});
+    };
+
+    mock_function.function_name = function_name;
+    mock_function.clear = function() {
+      this.call_count = 0;
+      this.call_args = [];
+      this.this_values = [];
+      this.most_recent_args = null;
+      this.most_recent_this_value = null;
+    }
+    mock_function.clear();
+    return mock_function;
+  }
+});
+
+})(Screw, Monarch);</diff>
      <filename>client/lib/screw/keywords.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,284 +1,286 @@
-module(&quot;Screw&quot;, function(c) { with(c) {
-  module(&quot;Matchers&quot;, function() {
-    def('equal', {
-      match: function(expected, actual) {
-        if(expected == actual) return true;
-        if(actual == undefined) return false;
-
-        if (expected instanceof Array) {
-          if (! (actual instanceof Array)) return false;
-          for (var i = 0; i &lt; actual.length; i++)
-            if (!Screw.Matchers.equal.match(expected[i], actual[i])) return false;
-          return actual.length == expected.length;
-        } else if (expected instanceof Object) {
-          for (var key in expected)
-            if (!this.match(expected[key], actual[key])) return false;
-          for (var key in actual)
-            if (!this.match(actual[key], expected[key])) return false;
-          return true;
-        }
-        return false;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not equal ' : ' to equal ') + Screw.$.print(expected);
-      }
-    });
-
-    def('be_gt', {
-      match: function(expected, actual) {
-        return actual &gt; expected;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than ' + Screw.$.print(expected);
-      }
-    });
-
-    def('be_gte', {
-      match: function(expected, actual) {
-        return actual &gt;= expected;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than or equal to ' + Screw.$.print(expected);
-      }
-    });
-
-    def('be_lt', {
-      match: function(expected, actual) {
-        return actual &lt; expected;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be less than ' + Screw.$.print(expected);
-      }
-    });
-
-    def('be_lte', {
-      match: function(expected, actual) {
-        return actual &lt;= expected;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be less than or equal to ' + Screw.$.print(expected);
-      }
-    });
-
-    def('match', {
-      match: function(expected, actual) {
-        if (expected.constructor == RegExp)
-          return expected.exec(actual.toString());
-        else
-          return actual.indexOf(expected) &gt; -1;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not match ' : ' to match ') + Screw.$.print(expected);
-      }
-    });
-
-    def('be_blank', {
-      match: function(expected, actual) {
-        if (actual == undefined) return true;
-        if (typeof(actual) == &quot;string&quot;) actual = actual.replace(/^\s*(.*?)\s*$/, &quot;$1&quot;);
-        return Screw.Matchers.be_empty.match(expected, actual);
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be blank' : ' to be blank');
-      }
-    });
-
-    def('be_empty', {
-      match: function(expected, actual) {
-        if (actual.length == undefined) throw(new Error(actual.toString() + &quot; does not respond to length&quot;));
-
-        return actual.length == 0;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be empty' : ' to be empty');
-      }
-    });
-
-    def('have_length', {
-      match: function(expected, actual) {
-        if (actual.length == undefined) throw(new Error(actual.toString() + &quot; does not respond to length&quot;));
-
-        return actual.length == expected;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not' : ' to') + ' have length ' + expected;
-      }
-    });
-
-    def('be_an_instance_of', {
-      match: function(expected, actual) {
-        return actual instanceof eval(expected);
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + typeof actual + (not ? ' not' : '') + ' be an instance of ' + expected;
-      }
-    });
-
-    def('be_null', {
-      match: function(expected, actual) {
-        return actual == null;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be null' : ' to be null');
+(function(Screw, Monarch) {
+
+Monarch.module(&quot;Screw.Matchers&quot;, {
+  equal: {
+    match: function(expected, actual) {
+      if(expected == actual) return true;
+      if(actual == undefined) return false;
+
+      if (expected instanceof Array) {
+        if (! (actual instanceof Array)) return false;
+        for (var i = 0; i &lt; actual.length; i++)
+          if (!Screw.Matchers.equal.match(expected[i], actual[i])) return false;
+        return actual.length == expected.length;
+      } else if (expected instanceof Object) {
+        for (var key in expected)
+          if (!this.match(expected[key], actual[key])) return false;
+        for (var key in actual)
+          if (!this.match(actual[key], expected[key])) return false;
+        return true;
       }
-    });
-
-    def('be_undefined', {
-      match: function(expected, actual) {
-        return actual == undefined;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be undefined' : ' to be undefined');
-      }
-    });
-
-    def('be_true', {
-      match: function(expected, actual) {
-        return actual;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be true' : ' to be true');
+      return false;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not equal ' : ' to equal ') + Screw.$.print(expected);
+    }
+  },
+
+  be_gt: {
+    match: function(expected, actual) {
+      return actual &gt; expected;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than ' + Screw.$.print(expected);
+    }
+  },
+
+  be_gte: {
+    match: function(expected, actual) {
+      return actual &gt;= expected;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than or equal to ' + Screw.$.print(expected);
+    }
+  },
+
+  be_lt: {
+    match: function(expected, actual) {
+      return actual &lt; expected;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be less than ' + Screw.$.print(expected);
+    }
+  },
+
+  be_lte: {
+    match: function(expected, actual) {
+      return actual &lt;= expected;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not ' : ' to ') + 'be less than or equal to ' + Screw.$.print(expected);
+    }
+  },
+
+  match: {
+    match: function(expected, actual) {
+      if (expected.constructor == RegExp)
+        return expected.exec(actual.toString());
+      else
+        return actual.indexOf(expected) &gt; -1;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not match ' : ' to match ') + Screw.$.print(expected);
+    }
+  },
+
+  be_blank: {
+    match: function(expected, actual) {
+      if (actual == undefined) return true;
+      if (typeof(actual) == &quot;string&quot;) actual = actual.replace(/^\s*(.*?)\s*$/, &quot;$1&quot;);
+      return Screw.Matchers.be_empty.match(expected, actual);
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be blank' : ' to be blank');
+    }
+  },
+
+  be_empty: {
+    match: function(expected, actual) {
+      if (actual.length == undefined) throw(new Error(actual.toString() + &quot; does not respond to length&quot;));
+
+      return actual.length == 0;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be empty' : ' to be empty');
+    }
+  },
+
+  have_length: {
+    match: function(expected, actual) {
+      if (actual.length == undefined) throw(new Error(actual.toString() + &quot; does not respond to length&quot;));
+
+      return actual.length == expected;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not' : ' to') + ' have length ' + expected;
+    }
+  },
+
+  be_an_instance_of: {
+    match: function(expected, actual) {
+      return actual instanceof eval(expected);
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + typeof actual + (not ? ' not' : '') + ' be an instance of ' + expected;
+    }
+  },
+
+  be_null: {
+    match: function(expected, actual) {
+      return actual == null;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be null' : ' to be null');
+    }
+  },
+
+  be_undefined: {
+    match: function(expected, actual) {
+      return actual == undefined;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be undefined' : ' to be undefined');
+    }
+  },
+
+  be_true: {
+    match: function(expected, actual) {
+      return actual;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be true' : ' to be true');
+    }
+  },
+
+  be_false: {
+    match: function(expected, actual) {
+      return !actual;
+    },
+
+    failure_message: function(expected, actual, not) {
+      return 'expected ' + Screw.$.print(actual) + (not ? ' to not be false' : ' to be false');
+    }
+  },
+
+  have_been_called: {
+    match: function(expectation, mock_function) {
+      if (expectation) {
+        return this.match_with_expectation(expectation, mock_function);
+      } else {
+        return mock_function.call_count &gt; 0;
       }
-    });
-
-    def('be_false', {
-      match: function(expected, actual) {
-        return !actual;
-      },
-
-      failure_message: function(expected, actual, not) {
-        return 'expected ' + Screw.$.print(actual) + (not ? ' to not be false' : ' to be false');
+    },
+
+    match_with_expectation: function(expectation, mock_function) {
+      if (expectation.__with_args__) {
+        return Screw.Matchers.equal.match(expectation.arguments, mock_function.most_recent_args);
+      } else if (expectation.__on_object__) {
+        return Screw.Matchers.equal.match(expectation.object, mock_function.most_recent_this_value);
+      } else if (typeof expectation == &quot;number&quot;) {
+        return mock_function.call_count == expectation;
+      } else {
+        throw new Error(&quot;unrecognized expectation argument for mock function: &quot; + expectation);
       }
-    });
+    },
 
-    def('have_been_called', {
-      match: function(expectation, mock_function) {
-        if (expectation) {
-          return this.match_with_expectation(expectation, mock_function);
+    error_message_expectation_fragment: function(expectation, not) {
+      if (!expectation) {
+        if (not) {
+          return &quot;&quot;;
         } else {
-          return mock_function.call_count &gt; 0;
+          return &quot; at least once&quot;;
         }
-      },
-
-      match_with_expectation: function(expectation, mock_function) {
+      } else {
         if (expectation.__with_args__) {
-          return Screw.Matchers.equal.match(expectation.arguments, mock_function.most_recent_args);
+          return &quot; with arguments &quot; + Screw.$.print(expectation.arguments);
         } else if (expectation.__on_object__) {
-          return Screw.Matchers.equal.match(expectation.object, mock_function.most_recent_this_value);
-        } else if (typeof expectation == &quot;number&quot;) {
-          return mock_function.call_count == expectation;
-        } else {
-          throw new Error(&quot;unrecognized expectation argument for mock function: &quot; + expectation);
-        }
-      },
-
-      error_message_expectation_fragment: function(expectation, not) {
-        if (!expectation) {
-          if (not) {
-            return &quot;&quot;;
-          } else {
-            return &quot; at least once&quot;;
-          }
-        } else {
-          if (expectation.__with_args__) {
-            return &quot; with arguments &quot; + Screw.$.print(expectation.arguments);
-          } else if (expectation.__on_object__) {
-            return &quot; on object &quot; + Screw.$.print(expectation.object);
-          } else {
-            return &quot; &quot; + expectation + &quot; time&quot; + ((expectation == 1) ? &quot;&quot; : &quot;s&quot;);
-          }
-        }
-      },
-
-      error_message_actual_fragment: function(expected, actual, not) {
-        if (expected &amp;&amp; expected.__with_args__) {
-          return &quot;with arguments &quot; + Screw.$.print(actual.most_recent_args);
-        } else if (expected &amp;&amp; expected.__on_object__) {
-          return &quot;on object &quot; + Screw.$.print(actual.most_recent_this_value);
-        } else {
-          return actual.call_count + &quot; time&quot; + ((actual.call_count == 1) ? &quot;&quot; : &quot;s&quot;);
-        }
-      },
-
-      failure_message: function(expected, actual, not) {
-        var message;
-        if (not) {
-          message = 'expected ' + actual.function_name + ' to have not been called' + this.error_message_expectation_fragment(expected, not);
+          return &quot; on object &quot; + Screw.$.print(expectation.object);
         } else {
-          message = 'expected ' + actual.function_name + ' to have been called' + this.error_message_expectation_fragment(expected, not);
+          return &quot; &quot; + expectation + &quot; time&quot; + ((expectation == 1) ? &quot;&quot; : &quot;s&quot;);
         }
-        message += ', but it was called ' + this.error_message_actual_fragment(expected, actual, not);
-        return message;
       }
-    });
-
-    def('once', 1);
-    def('twice', 2);
-    def('thrice', 3);
-
-    def('with_args', function() {
-      return {
-        __with_args__: true,
-        arguments: Array.prototype.slice.call(arguments)
-      };
-    });
-
-    def('on_object', function(object) {
-      return {
-        __on_object__: true,
-        object: object
-      };
-    });
-
-    def('contain', {
-      match: function(expected, actual) {
-        for(var i = 0; i &lt; actual.length; i++) {
-          if (actual[i] == expected) return true;
-        }
-        return false;
-      },
-
-      failure_message: function(expected, actual, not) {
-        if (not) {
-          return &quot;expected &quot; + Screw.$.print(actual) + &quot; to not contain &quot; + Screw.$.print(expected) + &quot;, but it did&quot;;
-        } else {
-          return &quot;expected &quot; + Screw.$.print(actual) + &quot; to contain &quot; + Screw.$.print(expected) + &quot;, but it did not&quot;;
-        }
+    },
+
+    error_message_actual_fragment: function(expected, actual, not) {
+      if (expected &amp;&amp; expected.__with_args__) {
+        return &quot;with arguments &quot; + Screw.$.print(actual.most_recent_args);
+      } else if (expected &amp;&amp; expected.__on_object__) {
+        return &quot;on object &quot; + Screw.$.print(actual.most_recent_this_value);
+      } else {
+        return actual.call_count + &quot; time&quot; + ((actual.call_count == 1) ? &quot;&quot; : &quot;s&quot;);
       }
-    });
-
-    def('throw_exception', {
-      match: function(expected, actual) {
-        var threw_exception;
-        try {
-          actual();
-          threw_exception = false;
-        } catch(e) {
-          threw_exception = true;
-        }
-        return threw_exception;
-      },
-      
-      failure_message: function(expected, actual, not) {
-        if (not) {
-          return &quot;expected function to not throw an exception, but it did&quot;;
-        } else {
-          return &quot;expected function to throw an exception, but it did not&quot;;
-        }
+    },
+
+    failure_message: function(expected, actual, not) {
+      var message;
+      if (not) {
+        message = 'expected ' + actual.function_name + ' to have not been called' + this.error_message_expectation_fragment(expected, not);
+      } else {
+        message = 'expected ' + actual.function_name + ' to have been called' + this.error_message_expectation_fragment(expected, not);
+      }
+      message += ' but it was called ' + this.error_message_actual_fragment(expected, actual, not);
+      return message;
+    }
+  },
+
+  once: 1,
+  twice: 2,
+  thrice: 3,
+
+  with_args: function() {
+    return {
+      __with_args__: true,
+      arguments: Array.prototype.slice.call(arguments)
+    };
+  },
+
+  on_object: function(object) {
+    return {
+      __on_object__: true,
+      object: object
+    };
+  },
+
+  contain: {
+    match: function(expected, actual) {
+      for(var i = 0; i &lt; actual.length; i++) {
+        if (actual[i] == expected) return true;
       }
-    });
-  });
-}});
+      return false;
+    },
+
+    failure_message: function(expected, actual, not) {
+      if (not) {
+        return &quot;expected &quot; + Screw.$.print(actual) + &quot; to not contain &quot; + Screw.$.print(expected) + &quot;, but it did&quot;;
+      } else {
+        return &quot;expected &quot; + Screw.$.print(actual) + &quot; to contain &quot; + Screw.$.print(expected) + &quot;, but it did not&quot;;
+      }
+    }
+  },
+
+  throw_exception: {
+    match: function(expected, actual) {
+      var threw_exception;
+      try {
+        actual();
+        threw_exception = false;
+      } catch(e) {
+        threw_exception = true;
+      }
+      return threw_exception;
+    },
+
+    failure_message: function(expected, actual, not) {
+      if (not) {
+        return &quot;expected function to not throw an exception, but it did&quot;;
+      } else {
+        return &quot;expected function to throw an exception, but it did not&quot;;
+      }
+    }
+  }
+});
+
+})(Screw, Monarch);</diff>
      <filename>client/lib/screw/matchers.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,17 @@
-module(&quot;Screw&quot;, function(c) { with (c) {
-  module(&quot;RunnableMethods&quot;, function() {
-    def('path', function() {
-      if (!this.parent_description) {
-        return [];
-      }
-      return this.parent_description.path().concat([this.index]);
-    });
-
-    def('on_example_completed', function(callback) {
-      this.example_completed_subscription_node.subscribe(callback);
-    });
-  });
-}});
+(function(Screw, Monarch) {
+
+Monarch.module(&quot;Screw.RunnableMethods&quot;, {
+  path: function() {
+    if (!this.parent_description) {
+      return [];
+    }
+    return this.parent_description.path().concat([this.index]);
+  },
+
+  on_example_completed: function(callback) {
+    this.example_completed_subscription_node.subscribe(callback);
+  }
+});
+
+})(Screw, Monarch);
+</diff>
      <filename>client/lib/screw/runnable_methods.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9d15d0b0ae1fd6ae94815a92d36a6fd47121d722</id>
    </parent>
  </parents>
  <author>
    <name>Grockit</name>
    <email>grockit@grok-a.local</email>
  </author>
  <url>http://github.com/nathansobo/screw-unit/commit/2903959d38a232e7ddcb3fd042a599255ca227cb</url>
  <id>2903959d38a232e7ddcb3fd042a599255ca227cb</id>
  <committed-date>2009-10-08T15:50:52-07:00</committed-date>
  <authored-date>2009-10-08T15:50:52-07:00</authored-date>
  <message>Halfway converted to using monarch and its module system</message>
  <tree>acafe6e4f39a40a7f30482c84a3afce8d7279cef</tree>
  <committer>
    <name>Grockit</name>
    <email>grockit@grok-a.local</email>
  </committer>
</commit>
