code: function OAuth(opts) {
      if(!(this instanceof OAuth)) {
          return new OAuth(opts);
      }
  
      if(!opts) {
          opts = {};
      }
  
      if(!opts.consumer) {
          throw new Error('consumer option is required');
      }
  
      this.consumer            = opts.consumer;
      this.nonce_length        = opts.nonce_length || 32;
      this.version             = opts.version || '1.0';
      this.parameter_seperator = opts.parameter_seperator || ', ';
      this.realm               = opts.realm;
  
      if(typeof opts.last_ampersand === 'undefined') {
          this.last_ampersand = true;
      } else {
          this.last_ampersand = opts.last_ampersand;
      }
  
      // default signature_method is 'PLAINTEXT'
      this.signature_method = opts.signature_method || 'PLAINTEXT';
  
      if(this.signature_method == 'PLAINTEXT' && !opts.hash_function) {
          opts.hash_function = function(base_string, key) {
              return key;
          }
      }
  
      if(!opts.hash_function) {
          throw new Error('hash_function option is required');
      }
  
      this.hash_function = opts.hash_function;
      this.body_hash_function = opts.body_hash_function || this.hash_function;
  }
docs: Constructor
  @param {Object} opts consumer key and secret