3 #define ISA_CACHE "::LINEALIZED_ISA_CACHE::"
5 #ifndef no_mro_get_linear_isa
7 mouse_mro_get_linear_isa(pTHX_ HV* const stash){
8 GV* const cachegv = *(GV**)hv_fetchs(stash, ISA_CACHE, TRUE);
14 gv_init(cachegv, stash, ISA_CACHE, sizeof(ISA_CACHE)-1, TRUE);
20 if(SvIOK(gen) && SvIVX(gen) == (IV)mro_get_pkg_gen(stash)){
21 return isa; /* returns the cache if available */
28 get_linear_isa = get_cv("Mouse::Util::get_linear_isa", TRUE);
38 mXPUSHp(HvNAME_get(stash), HvNAMELEN_get(stash));
41 call_sv((SV*)get_linear_isa, G_SCALAR);
47 if(SvROK(avref) && SvTYPE(SvRV(avref)) == SVt_PVAV){
48 AV* const av = (AV*)SvRV(avref);
49 I32 const len = AvFILLp(av) + 1;
52 for(i = 0; i < len; i++){
53 HV* const stash = gv_stashsv(AvARRAY(av)[i], FALSE);
55 av_push(isa, newSVpv(HvNAME(stash), 0));
60 Perl_croak(aTHX_ "Mouse:Util::get_linear_isa() didn't return an ARRAY reference");
67 sv_setiv(gen, (IV)mro_get_pkg_gen(stash));
70 #endif /* !no_mor_get_linear_isa */
73 /* equivalent to "blessed($x) && $x->isa($klass)" */
75 mouse_is_instance_of(pTHX_ SV* const sv, SV* const klass){
79 if(IsObject(sv) && SvOK(klass)){
85 ok = SvTRUEx(mcall1s(sv, "isa", klass));
98 mouse_is_class_loaded(pTHX_ SV * const klass){
103 if (!(SvPOKp(klass) && SvCUR(klass))) { /* XXX: SvPOK does not work with magical scalars */
107 stash = gv_stashsv(klass, FALSE);
112 if (( gvp = (GV**)hv_fetchs(stash, "VERSION", FALSE) )) {
113 if(isGV(*gvp) && GvSV(*gvp) && SvOK(GvSV(*gvp))){
118 if (( gvp = (GV**)hv_fetchs(stash, "ISA", FALSE) )) {
119 if(isGV(*gvp) && GvAV(*gvp) && av_len(GvAV(*gvp)) != -1){
125 while(( he = hv_iternext(stash) )){
126 GV* const gv = (GV*)HeVAL(he);
142 mouse_call0 (pTHX_ SV *const self, SV *const method)
151 call_sv(method, G_SCALAR | G_METHOD);
161 mouse_call1 (pTHX_ SV *const self, SV *const method, SV* const arg1)
172 call_sv(method, G_SCALAR | G_METHOD);
182 mouse_mg_find(pTHX_ SV* const sv, const MGVTBL* const vtbl, I32 const flags){
186 for(mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic){
187 if(mg->mg_virtual == vtbl){
192 if(flags & MOUSEf_DIE_ON_FAIL){
193 croak("mouse_mg_find: no MAGIC found for %"SVf, sv_2mortal(newRV_inc(sv)));