// SAFETY: PHP objects are single-threaded; method calls are safe within a request.
let result = unsafe { (*self.inner).try_call_method("{{ method_name }}", {{ args_expr }}) };
{% if is_result_type %}
match result {
{% if is_unit_return %}
Ok(_) => Ok(()),
{% elif is_primitive_return %}
Ok(val) => {
// For primitives, extract directly from Zval without JSON parsing
{% if return_type == "bool" %}
let int_val = val.long().unwrap_or_default() != 0;
{% else %}
let int_val = val.long().unwrap_or_default() as {{ return_type }};
{% endif %}
Ok(int_val)
}
{% else %}
Ok(val) => {
let json_str = val.string().unwrap_or_default();
serde_json::from_str(&json_str).map_err(|e| {{ deserialize_error_expr }})
}
{% endif %}
Err(e) => Err({{ call_error_expr }}),
}
{% else %}
match result {
{% if is_unit_return %}
Ok(_) => (),
{% elif is_primitive_return %}
{% if return_type == "bool" %}
Ok(val) => val.long().unwrap_or_default() != 0,
{% else %}
Ok(val) => val.long().unwrap_or_default() as {{ return_type }},
{% endif %}
{% else %}
Ok(val) => {
let json_str = val.string().unwrap_or_default();
serde_json::from_str(&json_str).unwrap_or_default()
}
{% endif %}
Err(_) => Default::default(),
}
{% endif %}