# Source: Pool.js

    module.exports = Pool;

    /**
     * @constructor
     * @param {Function} T
     */
    function Pool(T, factory)
    {
      this.freeList = [];
      this.count    = 0;
      this.T        = T;
    }

    /**
     * Get a pooled object
     */
    Pool.prototype.aquire = function()
    {
      // Grow the list by 20%ish if we're out
      if (this.freeList.length <= 0) {
        this.expand(Math.round(this.count*0.2) + 1);
      }

      var item = this.freeList.pop();

      // We can provide explicit initing, otherwise re-call constructor (hackish)
      if (item.__init)
        item.__init();
      else
        this.T.call(item);

      return item;
    };

    /**
     * Return an object back to the pool.
     */
    Pool.prototype.release = function(item)
    {
      this.freeList.push(item);
    };

    /**
     * @param {Number} count
     */
    Pool.prototype.expand = function(count)
    {
      for (var n = 0; n < count; n++)
        this.freeList.push(new this.T());
      this.count += count;
    };

    /**
     * @return {Number}
     */
    Pool.prototype.totalUsed = function()
    {
      return this.count - this.freeList.length;
    };