impl {{ wrapper }} {
    /// Create a new bridge wrapping a Python object.
    ///
    /// Validates that the Python object provides all required methods.
    pub fn new(python_obj: Py<PyAny>) -> PyResult<Self> {
        Python::attach(|py| {
            let obj = python_obj.bind(py);
{% for method in required_methods %}
            if !obj.hasattr("{{ method.name }}").unwrap_or(false) {
                return Err(pyo3::exceptions::PyAttributeError::new_err(
                    "Python object missing required method: {{ method.name }}",
                ));
            }
{% endfor %}
            let cached_name: String = obj
                .call_method0("name")
                .and_then(|v| v.extract())
                .unwrap_or_else(|_| "unknown".to_string());

            Ok(Self {
                inner: python_obj,
                cached_name,
            })
        })
    }
}
