+bool
+Perl_sv_does(pTHX_ SV *sv, const char *name)
+{
+ const char *classname;
+ bool does_it;
+
+ dSP;
+ ENTER;
+ SAVETMPS;
+
+ SvGETMAGIC(sv);
+
+ if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
+ || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
+ return FALSE;
+
+ if (sv_isobject(sv)) {
+ classname = sv_reftype(SvRV(sv),TRUE);
+ } else {
+ classname = SvPV(sv,PL_na);
+ }
+
+ if (strEQ(name,classname))
+ return TRUE;
+
+ PUSHMARK(SP);
+ XPUSHs(sv);
+ XPUSHs(sv_2mortal(newSVpv(name, 0)));
+ PUTBACK;
+
+ call_method("isa", G_SCALAR);
+ SPAGAIN;
+
+ does_it = SvTRUE( TOPs );
+ FREETMPS;
+ LEAVE;
+
+ return does_it;
+}
+