The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MP_STATIC XS(XS_APR__Request__Cookie_nil)
{
    dXSARGS;
    (void)items;
    XSRETURN_EMPTY;
}

static char *apreq_xs_cookie_pool_copy(pTHX_ SV *obj, SV *value)
{
    IV iv;
    STRLEN vlen;
    char *v;
    MAGIC *mg;
    apr_pool_t *p;
    SV *parent;

    if (!SvOK(value))
        return NULL;

    v = SvPV(value, vlen);
    mg = mg_find(obj, PERL_MAGIC_ext);
    iv = SvIVX(mg->mg_obj);

    /* The parent of a cookie can be a either handle or a pool.
     * Pool-type parents arise from make(), and are expected to
     * reflect the typical usage for apreq_xs_cookie_pool_copy.
     */
    parent = sv_2mortal(newRV_inc(mg->mg_obj));

    if (sv_derived_from(parent, "APR::Pool"))
        p = INT2PTR(apr_pool_t *, iv);

    else if (sv_derived_from(parent, "APR::Request"))
        p = (INT2PTR(apreq_handle_t *, iv))->pool;

    else
        croak("Pool not found: unrecognized parent class %s",
              HvNAME(SvSTASH(mg->mg_obj)));

    return apr_pstrmemdup(p, v, vlen);
}