## ObjectPool — 通用对象池（Autoload: ObjectPool）
## 权威来源：implementation_plan.md §2.1 Layer-0
##
## 使用约定：
##   1. 被池化对象必须实现 reset() 方法 （签名：func reset() -> void）
##   2. 取出：pool.acquire()  → 返回对象（内部已调 reset()）
##   3. 归还：pool.release(obj)
extends Node

## 创建一个指定工厂和容量的对象池
func create_pool(capacity: int, factory: Callable) -> PoolInstance:
	var p := PoolInstance.new()
	p._factory = factory
	for _i in capacity:
		p._stack.append(factory.call())
	return p

# ── PoolInstance 内部类（业务系统持有实例） ──────────────────────────────
class PoolInstance:
	var _factory: Callable
	var _stack: Array = []

	func acquire() -> Object:
		var obj: Object
		if _stack.is_empty():
			obj = _factory.call()
		else:
			obj = _stack.pop_back()
		if obj.has_method("reset"):
			obj.reset()
		return obj

	func release(obj: Object) -> void:
		_stack.append(obj)

	func get_available_count() -> int:
		return _stack.size()

	func drain() -> void:
		_stack.clear()
