-#if MGf_COPY
-STATIC int vmg_cb_call3(pTHX_ SV *cb, SV *sv, SV *data, SV *sv2, SV *sv3) {
-#define vmg_cb_call3(I, S, D, S2, S3) vmg_cb_call3(aTHX_ (I), (S), (D), (S2), (S3))
- SV *svr;
- int ret;
+#define vmg_cb_call1(I, F, S, A1) \
+ vmg_cb_call(aTHX_ (I), (((F) << VMG_CB_CALL_ARGS_SHIFT) | 1), (S), (A1))
+#define vmg_cb_call2(I, F, S, A1, A2) \
+ vmg_cb_call(aTHX_ (I), (((F) << VMG_CB_CALL_ARGS_SHIFT) | 2), (S), (A1), (A2))
+#define vmg_cb_call3(I, F, S, A1, A2, A3) \
+ vmg_cb_call(aTHX_ (I), (((F) << VMG_CB_CALL_ARGS_SHIFT) | 3), (S), (A1), (A2), (A3))
+
+STATIC int vmg_svt_get(pTHX_ SV *sv, MAGIC *mg) {
+ const MGWIZ *w = SV2MGWIZ(mg->mg_ptr);
+ return vmg_cb_call1(w->cb_get, w->opinfo, sv, mg->mg_obj);
+}
+
+STATIC int vmg_svt_set(pTHX_ SV *sv, MAGIC *mg) {
+ const MGWIZ *w = SV2MGWIZ(mg->mg_ptr);
+ return vmg_cb_call1(w->cb_set, w->opinfo, sv, mg->mg_obj);
+}
+
+STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
+ const MGWIZ *w = SV2MGWIZ(mg->mg_ptr);
+ unsigned int opinfo = w->opinfo;
+ U32 len, ret;
+ svtype t = SvTYPE(sv);