text: /* global P2_ARRAY_TYPE */
  
  module.exports = Utils;
  
  /**
   * Misc utility functions
   * @class Utils
   * @constructor
   */
  function Utils(){}
  
  /**
   * Append the values in array b to the array a. See <a href="http://stackoverflow.com/questions/1374126/how-to-append-an-array-to-an-existing-javascript-array/1374131#1374131">this</a> for an explanation.
   * @method appendArray
   * @static
   * @param  {Array} a
   * @param  {Array} b
   */
  Utils.appendArray = function(a,b){
      if (b.length < 150000) {
          a.push.apply(a, b);
      } else {
          for (var i = 0, len = b.length; i !== len; ++i) {
              a.push(b[i]);
          }
      }
  };
  
  /**
   * Garbage free Array.splice(). Does not allocate a new array.
   * @method splice
   * @static
   * @param  {Array} array
   * @param  {Number} index
   * @param  {Number} howmany
   */
  Utils.splice = function(array,index,howmany){
      howmany = howmany || 1;
      for (var i=index, len=array.length-howmany; i < len; i++){
          array[i] = array[i + howmany];
      }
      array.length = len;
  };
  
  /**
   * The array type to use for internal numeric computations throughout the library. Float32Array is used if it is available, but falls back on Array. If you want to set array type manually, inject it via the global variable P2_ARRAY_TYPE. See example below.
   * @static
   * @property {function} ARRAY_TYPE
   * @example
   *     <script>
   *         <!-- Inject your preferred array type before loading p2.js -->
   *         P2_ARRAY_TYPE = Array;
   *     </script>
   *     <script src="p2.js"></script>
   */
  if(typeof P2_ARRAY_TYPE !== 'undefined') {
      Utils.ARRAY_TYPE = P2_ARRAY_TYPE;
  } else if (typeof Float32Array !== 'undefined'){
      Utils.ARRAY_TYPE = Float32Array;
  } else {
      Utils.ARRAY_TYPE = Array;
  }
  
  /**
   * Extend an object with the properties of another
   * @static
   * @method extend
   * @param  {object} a
   * @param  {object} b
   */
  Utils.extend = function(a,b){
      for(var key in b){
          a[key] = b[key];
      }
  };
  
  /**
   * Extend an options object with default values.
   * @static
   * @method defaults
   * @param  {object} options The options object. May be falsy: in this case, a new object is created and returned.
   * @param  {object} defaults An object containing default values.
   * @return {object} The modified options object.
   */
  Utils.defaults = function(options, defaults){
      options = options || {};
      for(var key in defaults){
          if(!(key in options)){
              options[key] = defaults[key];
          }
      }
      return options;
  };
  