+STATIC OP *(*so_old_ck_refgen)(pTHX_ OP *) = 0;
+
+STATIC OP *so_ck_refgen(pTHX_ OP *o) {
+ o = CALL_FPTR(so_old_ck_refgen)(aTHX_ o);
+
+ if (so_hint()) {
+ OP *kid = o;
+ OP *prev = NULL;
+ OP *parent = NULL;
+
+ while (kid->op_flags & OPf_KIDS) {
+ parent = kid;
+ kid = cUNOPx(kid)->op_first;
+ }
+
+ if (!parent)
+ goto skip;
+
+ for (kid; kid; prev = kid, kid = kid->op_sibling) {
+ OP *gvop;
+ GV *gv;
+ const sub_op_config_t *c;
+
+ if (kid->op_type != OP_RV2CV)
+ continue;
+
+ gvop = so_find_gvop(kid, NULL, NULL);
+ if (!gvop)
+ continue;
+
+ gv = cGVOPx_gv(gvop);
+
+ {
+ SV **svp;
+ const char *name = GvNAME(gv);
+ I32 len = GvNAMELEN(gv);
+ dMY_CXT;
+
+ svp = hv_fetch(MY_CXT.map, name, len, 0);
+ if (!svp)
+ continue;
+
+ c = INT2PTR(const sub_op_config_t *, SvIVX(*svp));
+ }
+
+ if (c->ref) {
+ OP *new_kid = CALL_FPTR(c->ref)(aTHX_ kid, c->ud);
+
+ if (new_kid != kid) {
+ new_kid->op_sibling = kid->op_sibling;
+ new_kid->op_next = new_kid;
+ if (prev)
+ prev->op_sibling = new_kid;
+ else
+ cUNOPx(parent)->op_first = new_kid;
+ op_null(kid);
+ kid = new_kid;
+ }
+ }
+ }
+ }
+
+skip:
+ return o;
+}
+