docs: function( coef ){
  
              var constraints = this._angleConstraints
                  ,scratch = Physics.scratchpad()
                  ,trans = scratch.transform()
                  ,con
                  ,ang
                  ,corr
                  ,proportion
                  ,invMassSum
                  ;
  
              for ( var i = 0, l = constraints.length; i < l; ++i ){
  
                  con = constraints[ i ];
  
                  ang = con.bodyB.state.pos.angle2( con.bodyA.state.pos, con.bodyC.state.pos );
                  corr = ang - con.targetAngle;
  
                  if (!corr){
  
                      continue;
  
                  } else if (corr <= -Math.PI){
  
                      corr += TWOPI;
  
                  } else if (corr >= Math.PI){
  
                      corr -= TWOPI;
                  }
  
                  trans.setTranslation( con.bodyB.state.pos );
  
                  corr *= -coef * con.stiffness;
  
                  if ( con.bodyA.treatment === 'dynamic' && con.bodyB.treatment === 'dynamic' && con.bodyC.treatment === 'dynamic' ){
                      invMassSum = 1 / (con.bodyA.mass + con.bodyB.mass + con.bodyC.mass);
                  }
  
                  if ( con.bodyA.treatment === 'dynamic' ){
  
                      if ( con.bodyB.treatment === 'dynamic' && con.bodyC.treatment === 'dynamic' ){
  
                          ang = corr * (con.bodyB.mass + con.bodyC.mass) * invMassSum;
  
                      } else if ( con.bodyB.treatment !== 'dynamic' ){
  
                          ang = corr * con.bodyC.mass / ( con.bodyC.mass + con.bodyA.mass );
  
                      } else {
  
                          ang = corr * con.bodyB.mass / ( con.bodyB.mass + con.bodyA.mass );
                      }
  
  
                      trans.setRotation( ang );
                      con.bodyA.state.pos.translateInv( trans );
                      con.bodyA.state.pos.rotate( trans );
                      con.bodyA.state.pos.translate( trans );
                  }
  
                  if ( con.bodyC.treatment === 'dynamic' ){
  
                      if ( con.bodyA.treatment === 'dynamic' && con.bodyB.treatment === 'dynamic' ){
  
                          ang = -corr * (con.bodyB.mass + con.bodyA.mass) * invMassSum;
  
                      } else if ( con.bodyB.treatment !== 'dynamic' ){
  
                          ang = -corr * con.bodyA.mass / ( con.bodyC.mass + con.bodyA.mass );
  
                      } else {
  
                          ang = -corr * con.bodyB.mass / ( con.bodyB.mass + con.bodyC.mass );
                      }
  
                      trans.setRotation( ang );
                      con.bodyC.state.pos.translateInv( trans );
                      con.bodyC.state.pos.rotate( trans );
                      con.bodyC.state.pos.translate( trans );
                  }
  
                  if ( con.bodyB.treatment === 'dynamic' ){
  
                      if ( con.bodyA.treatment === 'dynamic' && con.bodyC.treatment === 'dynamic' ){
  
                          ang = corr * (con.bodyA.mass + con.bodyC.mass) * invMassSum;
  
                      } else if ( con.bodyA.treatment !== 'dynamic' ){
  
                          ang = corr * con.bodyC.mass / ( con.bodyC.mass + con.bodyB.mass );
  
                      } else {
  
                          ang = corr * con.bodyA.mass / ( con.bodyA.mass + con.bodyC.mass );
                      }
  
                      // ang = corr;
  
                      trans.setRotation( ang ).setTranslation( con.bodyA.state.pos );
                      con.bodyB.state.pos.translateInv( trans );
                      con.bodyB.state.pos.rotate( trans );
                      con.bodyB.state.pos.translate( trans );
  
                      trans.setTranslation( con.bodyC.state.pos );
                      con.bodyB.state.pos.translateInv( trans );
                      con.bodyB.state.pos.rotateInv( trans );
                      con.bodyB.state.pos.translate( trans );
                  }
  
                  con.bodyA.sleepCheck();
                  con.bodyB.sleepCheck();
                  con.bodyC.sleepCheck();
              }
  
              scratch.done();
          }