# Release v2.2.3 (2026-02-07)

**Fix PEP 563 (`from __future__ import annotations`) compatibility**

## Problem

Modules using `from __future__ import annotations` caused all type hints to remain as strings at runtime (e.g. `"Config"` instead of the `Config` class). pico-ioc read annotations directly via `param.annotation` and `f.type`, which broke dependency injection, factory return types, and configuration building.

## Fix

All annotation resolution points now use `typing.get_type_hints(obj, include_extras=True)` to resolve string annotations back to actual types, with a safe fallback to the raw annotation if resolution fails.

### Files changed

- **`analysis.py`**: `analyze_callable_dependencies()` resolves string annotations before iterating parameters.
- **`decorators.py`**: `get_return_type()` resolves string return annotations.
- **`config_runtime.py`**: `ObjectGraphBuilder._build()` resolves dataclass field types and constructor parameter types.
- **`config_registrar.py`**: `_build_flat_instance()` and `_auto_detect_mapping()` resolve dataclass field types.

### Tests added

- `tests/test_future_annotations.py`: 8 tests covering dependency analysis, return type extraction, container integration (component + factory), and configured dataclasses — all under `from __future__ import annotations`.

## Installation

```bash
pip install pico-ioc==2.2.3
```

**Full changelog:** [CHANGELOG.md](../CHANGELOG.md)
