docs: function(functions, payload, error) {
  		var payloadLength = payload.readUInt32LE(0);
  		var identifierEndPosition = 8 + payload.readUInt32LE(4);
  		var identifier = payload.slice(8, identifierEndPosition).toString(module.exports.encoding);
  		
  		var position = identifierEndPosition;
  		
  		var response = [ new Buffer(1) /* Status code response */ ];
  		if(identifier in functions) {
  			var args = [];
  			for(; position < payloadLength;) {
  				var dataType = payload.readUInt8(position++);
  				var dataSize = payload.readUInt32LE(position);
  				position += 4;
  				var value = undefined;
  				switch(dataType) {
  					case module.exports.EnumDataType.byte:
  						value = payload.readInt8(position);
  						position++;
  						break;
  					case module.exports.EnumDataType.ubyte:
  						value = payload.readUInt8(position);
  						position++;
  						break;
  					case module.exports.EnumDataType.short:
  						value = payload.readInt16LE(position);
  						position += 2;
  						break;
  					case module.exports.EnumDataType.ushort:
  						value = payload.readUInt16LE(position);
  						position += 2;
  						break;
  					case module.exports.EnumDataType.int:
  						value = payload.readInt32LE(position);
  						position += 4;
  						break;
  					case module.exports.EnumDataType.uint:
  						value = payload.readUInt32LE(position);
  						position += 4;
  						break;
  					case module.exports.EnumDataType.float:
  						value = payload.readFloatLE(position);
  						position += 4;
  						break;
  					case module.exports.EnumDataType.double:
  						value = payload.readDoubleLE(position);
  						position += 8;
  						break;
  					case module.exports.EnumDataType.string:
  						var next = position + dataSize;
  						value = payload.slice(position, next).toString(module.exports.encoding);
  						position = next;
  						break;
  					case module.exports.EnumDataType.boolean:
  						value = payload.readUInt8(position) > 0;
  						position++;
  						break;
  					case module.exports.EnumDataType.undefined:
  						value = undefined;
  						break;
  					case module.exports.EnumDataType.null:
  						value = null;
  						break;
  					default:
  						error(new Error('Unsupported data type argument received from client'));
  						response[0].writeUInt8(module.exports.EnumNodeResponse.NodeError, 0);
  						return response[0]; // Early exit
  				}
  				
  				args.push(value);
  			}
  	
  			var result = functions[identifier].callback.apply(this, args);
  			if(result === undefined) {
  				// TODO: Will be removed in future versions. This response type is now handled
  				// in the "Okay" response as the "undefined" datatype.
  				response[0].writeUInt8(module.exports.EnumNodeResponse.NoResult, 0);
  			}
  			else {
  				response[0].writeUInt8(module.exports.EnumNodeResponse.Okay, 0);
  				
  				var argtype = functions[identifier].responseType;
  				
  				if(!argtype) {
  					if(result === null) {
  						argtype = 'null';
  					}
  					else {
  						switch(typeof result) {
  							case 'number':
  								if(result === (result|0)) {
  									argtype = 'int'; // Default to int for normal numbers
  								}
  								else {
  									argtype = 'float'; // float for anything else
  								}
  								break;
  							case 'string':
  								argtype = 'string';
  								break;
  							case 'boolean':
  								argtype = 'boolean';
  								break;
  							case 'undefined':
  								argtype = 'undefiend';
  								break;
  						}
  					}
  					functions[identifier].responseType = argtype;
  				}
  				
  				var tempBuf = undefined;
  				var dataType = module.exports.EnumDataType[argtype];
  				if(dataType !== undefined) {
  					switch(dataType) {
  						case module.exports.EnumDataType.byte:
  							tempBuf = new Buffer(1);
  							tempBuf.writeInt8(result, 0);
  							break;
  						case module.exports.EnumDataType.ubyte:
  							tempBuf = new Buffer(1);
  							tempBuf.writeUInt8(result, 0);
  							break;
  						case module.exports.EnumDataType.short:
  							tempBuf = new Buffer(2);
  							tempBuf.writeInt16LE(result, 0);
  							break;
  						case module.exports.EnumDataType.ushort:
  							tempBuf = new Buffer(2);
  							tempBuf.writeUInt16LE(result, 0);
  							break;
  						case module.exports.EnumDataType.int:
  							tempBuf = new Buffer(4);
  							tempBuf.writeInt32LE(result, 0);
  							break;
  						case module.exports.EnumDataType.uint:
  							tempBuf = new Buffer(4);
  							tempBuf.writeUInt32LE(result, 0);
  							break;
  						case module.exports.EnumDataType.float:
  							tempBuf = new Buffer(4);
  							tempBuf.writeFloatLE(result, 0);
  							break;
  						case module.exports.EnumDataType.double:
  							tempBuf = new Buffer(8);
  							tempBuf.writeDoubleLE(result, 0);
  							break;
  						case module.exports.EnumDataType.string:
  							tempBuf = new Buffer(result);
  							break;
  						case module.exports.EnumDataType.boolean:
  							tempBuf = new Buffer(1);
  							tempBuf.writeUInt8(result ? 0x1 : 0x0, 0);
  							break;
  						case module.exports.EnumDataType.undefined:
  						case module.exports.EnumDataType.null:
  							tempBuf = new Buffer(0);
  							break;
  						default:
  							error(new Error('Data type' + dataType + ' has gone unhandled by this node implementation'));
  							response[0].writeUInt8(module.exports.EnumNodeResponse.NodeError, 0);
  							break;
  					}
  					
  					if(dataType < module.exports.EnumDataType._max) {
  						var argHeader = new Buffer(5);
  						argHeader.writeUInt8(dataType, 0);
  						argHeader.writeUInt32LE(tempBuf.length, 1);
  						response.push(argHeader);
  						response.push(tempBuf);
  					}
  				}
  				else {
  					error(new Error('Unsupported data type returned from nodesocket function'));
  					response[0].writeUInt8(module.exports.EnumNodeResponse.NodeError, 0);
  				}
  			}
  		}
  		else {
  			response[0].writeUInt8(module.exports.EnumNodeResponse.InvalidFunction, 0);
  		}
  	
  		return makeBufferPosResponse(Buffer.concat(response), position);
  	}