docs: function(property, getLength) {
      var propArray = property;
      var graph = this.graph;
      var root = graph.getNode(this.root);
      var parent = this.parent;
      var config = this.config;
  
      for ( var i=0, l=propArray.length; i < l; i++) {
        var pi = propArray[i];
        root.setPos($P(0, 0), pi);
        root.setData('span', Math.PI * 2, pi);
      }
  
      root.angleSpan = {
        begin : 0,
        end : 2 * Math.PI
      };
  
      graph.eachBFS(this.root, function(elem) {
        var angleSpan = elem.angleSpan.end - elem.angleSpan.begin;
        var angleInit = elem.angleSpan.begin;
        var len = getLength(elem);
        //Calculate the sum of all angular widths
        var totalAngularWidths = 0, subnodes = [], maxDim = {};
        elem.eachSubnode(function(sib) {
          totalAngularWidths += sib._treeAngularWidth;
          //get max dim
          for ( var i=0, l=propArray.length; i < l; i++) {
            var pi = propArray[i], dim = sib.getData('dim', pi);
            maxDim[pi] = (pi in maxDim)? (dim > maxDim[pi]? dim : maxDim[pi]) : dim;
          }
          subnodes.push(sib);
        }, "ignore");
        //Maintain children order
        //Second constraint for <http://bailando.sims.berkeley.edu/papers/infovis01.htm>
        if (parent && parent.id == elem.id && subnodes.length > 0
            && subnodes[0].dist) {
          subnodes.sort(function(a, b) {
            return (a.dist >= b.dist) - (a.dist <= b.dist);
          });
        }
        //Calculate nodes positions.
        for (var k = 0, ls=subnodes.length; k < ls; k++) {
          var child = subnodes[k];
          if (!child._flag) {
            var angleProportion = child._treeAngularWidth / totalAngularWidths * angleSpan;
            var theta = angleInit + angleProportion / 2;
  
            for ( var i=0, l=propArray.length; i < l; i++) {
              var pi = propArray[i];
              child.setPos($P(theta, len), pi);
              child.setData('span', angleProportion, pi);
              child.setData('dim-quotient', child.getData('dim', pi) / maxDim[pi], pi);
            }
  
            child.angleSpan = {
              begin : angleInit,
              end : angleInit + angleProportion
            };
            angleInit += angleProportion;
          }
        }
      }, "ignore");
    }