code: function(attributes) {
          this.attributes = attributes;
          this._attribute_table = {};
          var offset = 0;
          for (var i = 0; i < attributes.length; i++) {
              var a = attributes[i];
              this._attribute_table[a.name] = a;
  
              a.bytes = a.bytes || Float32Array.BYTES_PER_ELEMENT;
              a.type = a.type || this.context.FLOAT;
              a.offset = offset;
              a.location = this.context.getAttribLocation(this.shader, a.name);
  
              this.context.enableVertexAttribArray(a.location);
  
              offset += a.width;
          }
  
          // Stride is the full width including the last set
          this.stride = offset;
  
          // Create attribute array of correct size to hold max elements
          this._attributeArray = new Float32Array(
              this.array_size * 4 * this.stride
          );
          this._attributeBuffer = this.context.createBuffer();
          this._registryHoles = [];
          this._registrySize = 0;
      }
docs: Takes an array of attributes; see WebGLLayer's getProgramWrapper method