+STATIC void su_localize_elem(pTHX_ void *obj, SV *elem, SV *val, void (*do_elem)(pTHX_ void *, SV *, SV *)) {
+#define su_localize_elem(O, E, V, D) su_localize_elem(aTHX_ (O), (E), (V), (D))
+ AV *aelem, *aval;
+ if (SvROK(elem) && (aelem = (AV *) SvRV(elem), SvTYPE(aelem) == SVt_PVAV)) {
+ I32 i, last = av_len(aelem);
+ SV **svpe, **svpv;
+ if (!val) {
+ for (i = 0; i <= last; ++i) {
+ svpe = av_fetch(aelem, i, 0);
+ if (!svpe) continue;
+ do_elem(aTHX_ obj, *svpe, NULL);
+ }
+ } else if (SvROK(val) && (aval = (AV *) SvRV(val), SvTYPE(aval) == SVt_PVAV)){
+ for (i = 0; i <= last; ++i) {
+ svpe = av_fetch(aelem, i, 0);
+ if (!svpe) continue;
+ svpv = av_fetch(aval, i, 0);
+ if (!svpv) continue;
+ do_elem(aTHX_ obj, *svpe, *svpv);
+ }
+ }
+ } else {
+ do_elem(aTHX_ obj, elem, val);
+ }
+}
+