docs: function () {
          
          // PATCH by Simon Fishel
          //
          // execute plotRenderHook hook to pre-process the plotting options
          //
          // + if(series.options.hooks && series.options.hooks.plotRenderHook) {
          // +    series.options.hooks.plotRenderHook(series);
          // + }
          
          if(this.options.hooks && this.options.hooks.plotRenderHook) {
              this.options.hooks.plotRenderHook(this);
          }
          
  		var total = 0,
  			series = this,
  			cumulative = -0.25, // start at top
  			precision = 1000, // issue #172
  			options = series.options,
  			slicedOffset = options.slicedOffset,
  			connectorOffset = slicedOffset + options.borderWidth,
  			positions = options.center.concat([options.size, options.innerSize || 0]),
  			chart = series.chart,
  			plotWidth = chart.plotWidth,
  			plotHeight = chart.plotHeight,
  			start,
  			end,
  			angle,
  			data = series.data,
  			circ = 2 * mathPI,
  			fraction,
  			smallestSize = mathMin(plotWidth, plotHeight),
  			isPercent,
  			radiusX, // the x component of the radius vector for a given point
  			radiusY,
  			labelDistance = options.dataLabels.distance;
  
  		// get positions - either an integer or a percentage string must be given
  		positions = map(positions, function (length, i) {
  
  			isPercent = /%$/.test(length);
  			return isPercent ?
  				// i == 0: centerX, relative to width
  				// i == 1: centerY, relative to height
  				// i == 2: size, relative to smallestSize
  				// i == 4: innerSize, relative to smallestSize
  				[plotWidth, plotHeight, smallestSize, smallestSize][i] *
  					pInt(length) / 100 :
  				length;
  		});
  
  		// utility for getting the x value from a given y, used for anticollision logic in data labels
  		series.getX = function (y, left) {
  
  			angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance));
  
  			return positions[0] +
  				(left ? -1 : 1) *
  				(mathCos(angle) * (positions[2] / 2 + labelDistance));
  		};
  
  		// set center for later use
  		series.center = positions;
  
  		// get the total sum
  		each(data, function (point) {
  			total += point.y;
  		});
  
  		each(data, function (point) {
  			// set start and end angle
  			fraction = total ? point.y / total : 0;
  			start = mathRound(cumulative * circ * precision) / precision;
  			cumulative += fraction;
  			end = mathRound(cumulative * circ * precision) / precision;
  
  			// set the shape
  			point.shapeType = 'arc';
  			point.shapeArgs = {
  				x: positions[0],
  				y: positions[1],
  				r: positions[2] / 2,
  				innerR: positions[3] / 2,
  				start: start,
  				end: end
  			};
  
  			// center for the sliced out slice
  			angle = (end + start) / 2;
  			point.slicedTranslation = map([
  				mathCos(angle) * slicedOffset + chart.plotLeft,
  				mathSin(angle) * slicedOffset + chart.plotTop
  			], mathRound);
  
  			// set the anchor point for tooltips
  			radiusX = mathCos(angle) * positions[2] / 2;
  			radiusY = mathSin(angle) * positions[2] / 2;
  			point.tooltipPos = [
  				positions[0] + radiusX * 0.7,
  				positions[1] + radiusY * 0.7
  			];
  
  			// set the anchor point for data labels
  			point.labelPos = [
  				positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
  				positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
  				positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
  				positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
  				positions[0] + radiusX, // landing point for connector
  				positions[1] + radiusY, // a/a
  				labelDistance < 0 ? // alignment
  					'center' :
  					angle < circ / 4 ? 'left' : 'right', // alignment
  				angle // center angle
  			];
  
  			// API properties
  			point.percentage = fraction * 100;
  			point.total = total;
  
  		});
  
  
  		this.setTooltipPoints();
  	}