docs: function(modes) {
        var graph = this.viz.graph,
            accessors = {
              'node-property': {
                'getter': 'getData',
                'setter': 'setData'
              },
              'edge-property': {
                'getter': 'getData',
                'setter': 'setData'
              },
              'node-style': {
                'getter': 'getCanvasStyle',
                'setter': 'setCanvasStyle'
              },
              'edge-style': {
                'getter': 'getCanvasStyle',
                'setter': 'setCanvasStyle'
              }
            };
  
        //parse modes
        var m = {};
        if($.type(modes) == 'array') {
          for(var i=0, len=modes.length; i < len; i++) {
            var elems = modes[i].split(':');
            m[elems.shift()] = elems;
          }
        } else {
          for(var p in modes) {
            if(p == 'position') {
              m[modes.position] = [];
            } else {
              m[p] = $.splat(modes[p]);
            }
          }
        }
        
        graph.eachNode(function(node) { 
          node.startPos.set(node.pos);
          $.each(['node-property', 'node-style'], function(p) {
            if(p in m) {
              var prop = m[p];
              for(var i=0, l=prop.length; i < l; i++) {
                node[accessors[p].setter](prop[i], node[accessors[p].getter](prop[i]), 'start');
              }
            }
          });
          $.each(['edge-property', 'edge-style'], function(p) {
            if(p in m) {
              var prop = m[p];
              node.eachAdjacency(function(adj) {
                for(var i=0, l=prop.length; i < l; i++) {
                  adj[accessors[p].setter](prop[i], adj[accessors[p].getter](prop[i]), 'start');
                }
              });
            }
          });
        });
        return m;
      }