code: function Assertion (obj, flag, parent) {
      this.obj = obj;
      this.flags = {};
  
      if (undefined != parent) {
        this.flags[flag] = true;
  
        for (var i in parent.flags) {
          if (parent.flags.hasOwnProperty(i)) {
            this.flags[i] = true;
          }
        }
      }
  
      var $flags = flag ? flags[flag] : keys(flags)
        , self = this;
  
      if ($flags) {
        for (var i = 0, l = $flags.length; i < l; i++) {
          // avoid recursion
          if (this.flags[$flags[i]]) continue;
  
          var name = $flags[i]
            , assertion = new Assertion(this.obj, name, this)
  
          if ('function' == typeof Assertion.prototype[name]) {
            // clone the function, make sure we dont touch the prot reference
            var old = this[name];
            this[name] = function () {
              return old.apply(self, arguments);
            };
  
            for (var fn in Assertion.prototype) {
              if (Assertion.prototype.hasOwnProperty(fn) && fn != name) {
                this[name][fn] = bind(assertion[fn], assertion);
              }
            }
          } else {
            this[name] = assertion;
          }
        }
      }
    }
docs: Constructor
  
  @api private