docs: function( data ){
  
              var bodies = this.getTargets()
                  ,body
                  ,other
                  ,scratch = Physics.scratchpad()
                  ,potential = scratch.vector()
                  ,comp
                  ,bodyA
                  ,bodyB
                  ,posA = scratch.vector()
                  ,posB = scratch.vector()
                  ,i, j, k, m, l, ll, lll
                  ;
  
              for ( j = 0, l = bodies.length; j < l; j++ ){
  
                  body = bodies[ j ];
  
                  for ( i = j + 1; i < l; i++ ){
  
                      other = bodies[ i ];
  
                      if ( body.name === 'compound' ){
                          comp = body;
                      } else if ( other.name === 'compound' ){
                          comp = other;
                          other = body;
                      }
  
                      if ( comp ){
                          if ( other.name === 'compound' ){
                              for ( k = 0, ll = comp.children.length; k < ll; k++ ){
                                  bodyA = comp.children[ k ];
                                  comp.toWorldCoords( posA.clone( bodyA.state.pos ).vadd( comp.offset ) );
                                  for ( m = 0, lll = other.children.length; m < lll; m++ ){
                                      bodyB = other.children[ m ];
                                      other.toWorldCoords( posB.clone( bodyB.state.pos ).vadd( other.offset ) );
                                      this.calcPotential( posA, posB, potential );
                                      comp.accelerate( potential.mult( bodyB.mass ) );
                                      other.accelerate( potential.mult( bodyA.mass/bodyB.mass ).negate() );
                                  }
                              }
                          } else {
                              for ( k = 0, ll = comp.children.length; k < ll; k++ ){
                                  bodyA = comp.children[ k ];
                                  comp.toWorldCoords( posA.clone( bodyA.state.pos ).vadd( comp.offset ) );
                                  this.calcPotential( posA, other.state.pos, potential );
                                  comp.accelerate( potential.mult( other.mass ) );
                                  other.accelerate( potential.mult( bodyA.mass/other.mass ).negate() );
                              }
                          }
  
                      } else {
  
                          this.calcPotential( body.state.pos, other.state.pos, potential );
                          body.accelerate( potential.mult( other.mass ) );
                          other.accelerate( potential.mult( body.mass/other.mass ).negate() );
                      }
  
                      comp = null;
                  }
              }
  
              scratch.done();
          }