  priv.each = function(array, fn) {
    var i;
    var len = array.length;
    if ('length' in array) {
      for (i = 0; i < len; i++) {
        fn.call(this, array[i], i, array);
      }
    } else {
      for (i in array) {
        if (array.hasOwnProperty(i)) {
          fn.call(this, array[i], i, array);
        }
      }
    }
  };

  priv.reduce = function(array, fn, memo) {
    priv.each.call(this, array, function(el, ix, list) {
      memo = fn(memo, el, ix, list);
    });
    return memo;
  };

  priv.all = function(array, fn) {
    var i;
    var len = array.length;
    for (i = 0; i < len; i++) {
      if (fn.call(this, array[i], i, array) === false) {
        return false;
      }
    }
    return true;
  };

  priv.some = function(array, fn) {
    var i;
    var len = array.length;
    for (i = 0; i < len; i++) {
      if (fn.call(this, array[i], i, array) === true) {
        return true;
      }
    }
    return false;
  };

  priv.expectAllMembers = function(assertion) {
    return priv.all.call(this, this.actual, function(item) {
      return matchers[assertion].call({
        actual: item
      });
    });
  };

  /**
   * Assert subject is of type
   * @param  {Mixed} subject
   * @param  {String} type
   * @return {Boolean}
   */

  priv.is = function(subject, type) {
    return Object.prototype.toString.call(subject) === '[object ' + type + ']';
  };

  /**
   * Assert subject is an HTML Element with the given node type
   * @return {Boolean}
   */

  priv.isHtmlElementOfType = function(subject, type) {
    return subject && subject.nodeType === type;
  };

  /**
   * Convert Array-like Object to true Array
   * @param  {Mixed[]} list
   * @return {Array}
   */

  priv.toArray = function(list) {
    return [].slice.call(list);
  };

@@ -1,16 +1,94 @@
+  /**%0A   * @inner%0A   * @param  %7BArray%7D array%0A   * @param  %7BFunction%7D fn%0A   */%0A
   priv.each = fu
@@ -99,32 +99,32 @@
 on(array, fn) %7B%0A
-
     var i;%0A    v
@@ -408,24 +408,146 @@
     %7D%0A  %7D;%0A%0A
+  /**%0A   * @inner%0A   * @param  %7BArray%7D array%0A   * @param  %7BFunction%7D fn%0A   * @param  %7B*%7D memo%0A   * @return %7B*%7D memo%0A   */%0A
   priv.reduc
@@ -699,24 +699,125 @@
 memo;%0A  %7D;%0A%0A
+  /**%0A   * @inner%0A   * @param  %7BArray%7D array%0A   * @param  %7BFunction%7D fn%0A   * @return %7BBoolean%7D%0A   */%0A
   priv.all =
@@ -1022,24 +1022,125 @@
 true;%0A  %7D;%0A%0A
+  /**%0A   * @inner%0A   * @param  %7BArray%7D array%0A   * @param  %7BFunction%7D fn%0A   * @return %7BBoolean%7D%0A   */%0A
   priv.some 
@@ -1349,16 +1349,97 @@
 ;%0A  %7D;%0A%0A
+  /**%0A   * @inner%0A   * @param  %7BString%7D matcherName%0A   * @return %7BBoolean%7D%0A   */%0A
   priv.e
@@ -1465,25 +1465,27 @@
 unction(
-assertion
+matcherName
 ) %7B%0A    
@@ -1567,17 +1567,19 @@
 ers%5B
-assertion
+matcherName
 %5D.ca
@@ -1661,24 +1661,36 @@
  is of type%0A
+   * @inner%0A
    * @param 
@@ -1691,21 +1691,17 @@
 param  %7B
-Mixed
+*
 %7D subjec
@@ -1750,33 +1750,32 @@
 %7BBoolean%7D%0A   */%0A
-%0A
   priv.is = func
@@ -1948,24 +1948,88 @@
 n node type%0A
+   * @inner%0A   * @param  %7B*%7D subject%0A   * @param  %7BString%7D type%0A
    * @return
@@ -2041,25 +2041,24 @@
 lean%7D%0A   */%0A
-%0A
   priv.isHtm
@@ -2202,24 +2202,36 @@
  true Array%0A
+   * @inner%0A
    * @param 
@@ -2236,15 +2236,9 @@
 m  %7B
-Mixed%5B%5D
+*
 %7D li
@@ -2267,17 +2267,16 @@
 %7D%0A   */%0A
-%0A
   priv.t
@@ -2297,24 +2297,24 @@
 ion(list) %7B%0A
-
     return %5B
@@ -2330,16 +2330,393 @@
 all(list);%0A  %7D;%0A
+%0A  /**%0A   * @inner%0A   * @param  %7BString%7D matcherName%0A   * @return %7BFunction%7D%0A   */%0A  priv.assertMember = function(matcherName) %7B%0A    return function() %7B%0A      var args = priv.toArray(arguments);%0A      var memberName = args.shift();%0A      return matchers.toBeObject.call(this) && matchers%5BmatcherName%5D.apply(%7B%0A        actual: this.actual%5BmemberName%5D%0A      %7D, args);%0A    %7D;%0A  %7D;%0A

Annotate private members.