docs: function Buffer(subject, encoding, offset) {
    if (!(this instanceof Buffer)) {
      return new Buffer(subject, encoding, offset);
    }
  
    var type;
  
    // Are we slicing?
    if (typeof offset === 'number') {
      this.length = coerce(encoding);
      this.parent = subject;
      this.offset = offset;
    } else {
      // Find the length
      switch (type = typeof subject) {
        case 'number':
          this.length = coerce(subject);
          break;
  
        case 'string':
          this.length = Buffer.byteLength(subject, encoding);
          break;
  
        case 'object': // Assume object is an array
          this.length = coerce(subject.length);
          break;
  
        default:
          throw new Error('First argument needs to be a number, ' +
                          'array or string.');
      }
  
      if (this.length > Buffer.poolSize) {
        // Big buffer, just alloc one.
        this.parent = new SlowBuffer(this.length);
        this.offset = 0;
  
      } else {
        // Small buffer.
        if (!pool || pool.length - pool.used < this.length) allocPool();
        this.parent = pool;
        this.offset = pool.used;
        pool.used += this.length;
      }
  
      // Treat array-ish objects as a byte array.
      if (isArrayIsh(subject)) {
        for (var i = 0; i < this.length; i++) {
          this.parent[i + this.offset] = subject[i];
        }
      } else if (type == 'string') {
        // We are a string
        this.length = this.write(subject, 0, encoding);
      }
    }
  
  }