/// Configure the service via '{{ method_name }}'.
///
/// # Safety
/// - `owner` must be a valid pointer returned by `{{ new_fn_name }}()` and not yet freed.
/// - The same `owner` pointer is returned on success — the caller does **not**
///   need to swap the handle they hold. Returns `null` on failure (the original
///   handle is still valid in that case but should be inspected for usability).
#[no_mangle]
pub extern "C" fn {{ fn_name }}(
    owner: *mut {{ opaque_name }}{{ param_decls }}
) -> *mut {{ opaque_name }} {
    if owner.is_null() {
        return std::ptr::null_mut();
    }
{{ pre_call_body }}    // SAFETY: owner was allocated by _new() and is valid until freed.
    // Take the inner box out, transform it, and put the result back. The opaque
    // shell stays at the same address so the caller's handle remains valid.
    unsafe {
        let inner = match (*owner).inner.take() {
            Some(boxed) => *boxed,
            None => return std::ptr::null_mut(),
        };
        (*owner).inner = Some(Box::new(inner.{{ method_name }}({{ call_args }})));
    }
    owner
}
