pull(name, ...args) {
		const className = this.objectClass[name];
		if (className) {
			const proto = className["class"];
			const poolArray = className.pool;
			let obj;

			if (poolArray && (obj = poolArray.pop())) {
				// poolable object must implement a `onResetEvent` method
				obj.onResetEvent.apply(obj, args);
				this.instance_counter--;
			} else {
				// create a new instance
				obj = new (proto.bind.apply(proto, [proto, ...args]))();
				if (poolArray) {
					obj.className = name;
				}
			}
			return obj;
		}
		throw new Error("Cannot instantiate object of type '" + name + "'");
	}
Pull a new instance of the requested object (if added into the object pool)
@param {string} name - as used in {@link pool.register}
@param {...*} [args] - arguments to be passed when instantiating/reinitializing the object
@returns {object} the instance of the requested object
@example
me.pool.register("bullet", BulletEntity, true);
me.pool.register("enemy", EnemyEntity, true);
// ...
// when we need to manually create a new bullet:
let bullet = me.pool.pull("bullet", x, y, direction);
// ...
// params aren't a fixed number
// when we need new enemy we can add more params, that the object construct requires:
let enemy = me.pool.pull("enemy", x, y, direction, speed, power, life);
// ...
// when we want to destroy existing object, the remove
// function will ensure the object can then be reallocated later
me.game.world.removeChild(enemy);
me.game.world.removeChild(bullet);