code: function match( o, p, strict ) {
  
          var o_type = get_type( o ),
              p_type = get_type( p );
  
          if ( strict ) {
  
              // In strict mode, objects must have the same type
              if ( o_type !== p_type ) { return false; }
  
              switch( o_type ) {
  
                  case 'array':
                      return match_arrays( o, p, true );
  
                  case 'boolean':
                      return o === p;
  
                  case 'nan':
                  case 'null':
                  case 'undefined':
                      return true;
  
                  case 'function':
                  case 'number':
                  case 'regexp':
                  case 'string':
                      return o.toString() === p.toString();
  
                  case 'object':
                      return match_objects( o, p, true );
  
              }
  
          } else {
  
              switch( p_type ) {
  
                  case 'array':
                      return o_type === 'array'
                                  ? match_arrays( o, p, false )
                                  : false;
  
                  case 'boolean':
                  case 'number':
                  case 'string':
                      return p == o;
  
                  case 'function':
                      return !!p( o );
  
                  case 'nan':
                      return isNaN( o );
  
                  case 'null':
                  case 'undefined':
                      return o_type === p_type;
  
                  case 'object':
                      return o_type === 'object'
                                  ? match_objects( o, p, false )
                                  : false;
  
                  case 'regexp':
                      return o_type === 'string' && p.test( o );
  
              }
  
          }
  
      }
docs: o:object, p:pattern