+ dSP;
+ SV * callback;
+ GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+ callback = self->cb_named_capture_buff_FETCH;
+
+ if (callback) {
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(rx->pprivate);
+ XPUSHs(SvREFCNT_inc(key));
+ XPUSHs(sv_2mortal(newSViv(flags & 1 ? 1 : 0)));
+ PUTBACK;
+
+ call_sv(callback, G_SCALAR);
+
+ SPAGAIN;
+
+ SV* ret = POPs;
+ SvREFCNT_inc(ret);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+
+ return ret;
+ } else {
+ return NULL;
+ }
+}
+
+void
+Plugin_named_buff_STORE(pTHX_ REGEXP * const rx, SV * const key,
+ SV * const value, const U32 flags)
+{
+ dSP;
+ SV * callback;
+ GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+ callback = self->cb_named_capture_buff_STORE;
+
+ if (callback) {
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(rx->pprivate);
+ XPUSHs(SvREFCNT_inc(key));
+ XPUSHs(SvREFCNT_inc(value));
+ XPUSHs(sv_2mortal(newSViv(flags)));
+ PUTBACK;
+
+ call_sv(callback, G_DISCARD);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+}
+
+void
+Plugin_named_buff_DELETE(pTHX_ REGEXP * const rx, SV * const key, const U32 flags)
+{
+ dSP;
+ SV * callback;
+ GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+ callback = self->cb_named_capture_buff_DELETE;
+
+ if (callback) {
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(rx->pprivate);
+ XPUSHs(SvREFCNT_inc(key));
+ XPUSHs(sv_2mortal(newSViv(flags)));
+ PUTBACK;
+
+ call_sv(callback, G_DISCARD);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+}
+
+void
+Plugin_named_buff_CLEAR(pTHX_ REGEXP * const rx, const U32 flags)
+{
+ dSP;
+ SV * callback;
+ GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+ callback = self->cb_named_capture_buff_CLEAR;
+
+ if (callback) {
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(rx->pprivate);
+ XPUSHs(sv_2mortal(newSViv(flags)));
+ PUTBACK;
+
+ call_sv(callback, G_DISCARD);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+}
+
+bool
+Plugin_named_buff_EXISTS(pTHX_ REGEXP * const rx, SV * const key,
+ const U32 flags)
+{
+ dSP;
+ SV * callback;
+ bool truthiness = FALSE;
+ GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+ callback = self->cb_named_capture_buff_EXISTS;
+
+ if (callback) {
+ ENTER;
+ SAVETMPS;
+
+ PUSHMARK(SP);
+ XPUSHs(rx->pprivate);
+ XPUSHs(SvREFCNT_inc(key));
+ XPUSHs(sv_2mortal(newSViv(flags)));
+ PUTBACK;
+
+ call_sv(callback, G_SCALAR);
+
+ SPAGAIN;
+
+ SV * ret = POPs;
+ truthiness = SvTRUE(ret);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+ return truthiness;