Reusable pie chart updates

HTML

<script src="http://d3js.org/d3.v3.min.js"></script>
<div id="viz"></div>

JavaScript

d3.edge = {};

d3.edge.donut = function module() {

	var width = 460,
	    height = 300,
	    radius = Math.min(width, height) / 2;

    var color = d3.scale.category20(), svg;
    
   var dispatch = d3.dispatch("customHover");
   function graph(_selection) {
       _selection.each(function(_data) {	

			var pie = d3.layout.pie()
				.value(function(d) { return d; })
		    	.sort(null);
			
			var arc = d3.svg.arc()
				.innerRadius(radius - 100)
				.outerRadius(radius - 50);
				
			if (!svg){
				svg = d3.select(this).append("svg")
			    	.attr("width", width)
			    	.attr("height", height)
			    	.append("g")
			    	.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
			}
			var path = svg.selectAll("path")
			    .data(pie(_data));
			path.enter().append("path")
			    .attr("fill", function(d, i) { return color(i); })
			    .attr("d", arc)
				.each(function(d) {this._current = d;} );
			path.transition()
			      .attrTween("d", arcTween);
           path.exit().remove()
			
			function arcTween(a) {
			  var i = d3.interpolate(this._current, a);
			  this._current = i(0);
			  return function(t) {
			    return arc(i(t));
			  };
			}
		});

	}
	d3.rebind(graph, dispatch, "on");
	return graph;
}

var donut = d3.edge.donut();
var container = d3.select("#viz");

function update() {
    var data = d3.range(~~(Math.random() * 20)).map(function(d, i) {
        return ~~(Math.random() * 100);
    });
    container.datum(data).call(donut);
}

update();
setTimeout( update, 1000);