#[pyfunction]
pub fn {{ register_fn }}(py: Python<'_>, backend: Py<PyAny>) -> PyResult<()> {
{% if has_required_methods %}
    let required_methods = [{{ required_methods_str }}];
    let obj = backend.bind(py);
    for method in &required_methods {
        if !obj.hasattr(*method)? {
            return Err(pyo3::exceptions::PyAttributeError::new_err(
                format!("Backend missing required method: {}", method)
            ));
        }
    }
{% endif %}

    let wrapper = {{ wrapper }}::new(backend)?;
    let arc: Arc<dyn {{ trait_path }}> = Arc::new(wrapper);

    py.detach(|| {
        let registry = {{ registry_getter }}();
        let mut registry = registry.write();
        registry.register(arc{{ register_extra_args }}).map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(
            format!("Failed to register backend: {}", e)
        ))
    })?;
    Ok(())
}
