docs: function createWhere(properties, value, equals)
  {
    var equality = equals || equalsStrict;
  
    if ( isFunction( properties ) )
    {
      return properties;
    }
    else if ( isArray( properties ) )
    {
      var parsed = [];
  
      for (var i = 0; i < properties.length; i++)
      {
        var where = properties[ i ];
  
        parsed.push( isArray( where ) ? createWhere.apply( this, where ) : createWhere( where ) );
      }
  
      return function whereMultiple(model)
      {
        for (var i = 0; i < parsed.length; i++)
        {
          if ( !parsed[ i ]( model ) )
          {
            return false;
          }
        }
  
        return true;
      };
    }
    else if ( isObject( properties ) )
    {
      var props = [];
  
      for (var prop in properties)
      {
        props.push({
          tester:   exprEqualsTester( properties[ prop ], equality ),
          resolver: createPropertyResolver( prop )
        });
      }
  
      return function whereEqualsObject(model)
      {
        for (var i = 0; i < props.length; i++)
        {
          var prop = props[ i ];
  
          if ( !prop.tester( prop.resolver( model ) ) )
          {
            return false;
          }
        }
  
        return true;
      };
    }
    else if ( isString( properties ) )
    {
      if ( properties in Wheres )
      {
        return Wheres[ properties ];
      }
  
      var resolver = createPropertyResolver( properties );
  
      if ( isValue( value ) )
      {
        var tester = exprEqualsTester( value, equality );
  
        return function whereEqualsValue(model)
        {
          return tester( resolver( model ) );
        };
      }
      else
      {
        return function whereHasValue(model)
        {
          return isValue( resolver( model ) );
        };
      }
    }
    else
    {
      return function whereAll(model)
      {
        return true;
      };
    }
  }