3 SV *mop_method_metaclass;
4 SV *mop_associated_metaclass;
5 SV *mop_associated_attribute;
12 SV *mop_package_cache_flag;
20 /* equivalent to "blessed($x) && $x->isa($klass)" */
22 mop_is_instance_of(pTHX_ SV* const sv, SV* const klass){
26 if(SvROK(sv) && SvOBJECT(SvRV(sv)) && SvOK(klass)){
32 ok = SvTRUEx(mop_call1(aTHX_ sv, mop_isa, klass));
44 find_method (const char *key, STRLEN keylen, SV *val, void *ud)
46 bool * const found_method = (bool *)ud;
48 PERL_UNUSED_ARG(keylen);
56 mop_is_class_loaded(pTHX_ SV * const klass){
60 if (!(SvPOKp(klass) && SvCUR(klass))) { /* XXX: SvPOK does not work with magical scalars */
64 stash = gv_stashsv(klass, 0);
69 if (( he = hv_fetch_ent (stash, mop_VERSION, FALSE, 0U) )) {
70 GV* const version_gv = (GV*)HeVAL(he);
71 if(isGV(version_gv) && GvSV(version_gv) && SvOK(GvSV(version_gv))){
76 if (( he = hv_fetch_ent (stash, mop_ISA, FALSE, 0U) )) {
77 GV* const isa_gv = (GV*)HeVAL(he);
78 if(isGV(isa_gv) && GvAV(isa_gv) && av_len(GvAV(isa_gv)) != -1){
84 bool found_method = FALSE;
85 mop_get_package_symbols(stash, TYPE_FILTER_CODE, find_method, &found_method);
90 MODULE = Class::MOP PACKAGE = Class::MOP
95 mop_method_metaclass = MAKE_KEYSV(method_metaclass);
96 mop_associated_metaclass = MAKE_KEYSV(associated_metaclass);
97 mop_associated_attribute = MAKE_KEYSV(associated_attribute);
98 mop_wrap = MAKE_KEYSV(wrap);
99 mop_methods = MAKE_KEYSV(methods);
100 mop_name = MAKE_KEYSV(name);
101 mop_body = MAKE_KEYSV(body);
102 mop_package = MAKE_KEYSV(package);
103 mop_package_name = MAKE_KEYSV(package_name);
104 mop_package_cache_flag = MAKE_KEYSV(_package_cache_flag);
105 mop_initialize = MAKE_KEYSV(initialize);
106 mop_Class = MAKE_KEYSV(Class::MOP::Class);
107 mop_VERSION = MAKE_KEYSV(VERSION);
108 mop_ISA = MAKE_KEYSV(ISA);
109 mop_isa = MAKE_KEYSV(isa);
110 mop_can = MAKE_KEYSV(can);
112 MOP_CALL_BOOT( Class__MOP__Package );
113 MOP_CALL_BOOT( Class__MOP__Class );
114 MOP_CALL_BOOT( Class__MOP__Attribute );
115 MOP_CALL_BOOT( Class__MOP__Instance );
116 MOP_CALL_BOOT( Class__MOP__Method );
117 MOP_CALL_BOOT( Class__MOP__Method__Accessor );
118 MOP_CALL_BOOT( Class__MOP__Method__Constructor );
120 # use prototype here to be compatible with get_code_info from Sub::Identify
122 get_code_info(coderef)
130 if (mop_get_code_info(coderef, &pkg, &name)) {
132 mPUSHs(newSVpv(pkg, 0));
133 mPUSHs(newSVpv(name, 0));
138 is_class_loaded(SV* klass = &PL_sv_undef)
145 #is_instance_of(SV* sv, SV* klass)