Commit | Line | Data |
df6dd016 |
1 | #include "mouse.h" |
2 | |
cccb83de |
3 | SV* mouse_package; |
4 | SV* mouse_namespace; |
5 | |
df6dd016 |
6 | MODULE = Mouse PACKAGE = Mouse::Util |
7 | |
8 | PROTOTYPES: DISABLE |
9 | |
cccb83de |
10 | BOOT: |
11 | mouse_package = newSVpvs_share("package"); |
12 | mouse_namespace = newSVpvs_share("namespace"); |
13 | |
14 | |
df6dd016 |
15 | bool |
16 | is_class_loaded(SV* sv = &PL_sv_undef) |
17 | |
18 | void |
19 | get_code_info(CV* code) |
20 | PREINIT: |
21 | GV* gv; |
22 | HV* stash; |
23 | PPCODE: |
24 | if((gv = CvGV(code)) && isGV(gv) && (stash = GvSTASH(gv))){ |
25 | EXTEND(SP, 2); |
26 | mPUSHs(newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U)); |
27 | mPUSHs(newSVpvn_share(GvNAME_get(gv), GvNAMELEN_get(gv), 0U)); |
28 | } |
29 | |
30 | SV* |
31 | get_code_package(CV* code) |
32 | PREINIT: |
33 | HV* stash; |
34 | CODE: |
35 | if(CvGV(code) && isGV(CvGV(code)) && (stash = GvSTASH(CvGV(code)))){ |
36 | RETVAL = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U); |
37 | } |
38 | else{ |
39 | RETVAL = &PL_sv_no; |
40 | } |
41 | OUTPUT: |
42 | RETVAL |
43 | |
43165725 |
44 | MODULE = Mouse PACKAGE = Mouse::Meta::Module |
45 | |
46 | BOOT: |
47 | INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package); |
48 | INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods); |
49 | INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes); |
50 | |
2591e962 |
51 | HV* |
cccb83de |
52 | namespace(SV* self) |
2591e962 |
53 | CODE: |
54 | { |
cccb83de |
55 | SV* const package = mouse_instance_get_slot(self, mouse_package); |
56 | if(!(package && SvOK(package))){ |
2591e962 |
57 | croak("No package name"); |
58 | } |
cccb83de |
59 | RETVAL = gv_stashsv(package, GV_ADDMULTI); |
60 | } |
61 | OUTPUT: |
62 | RETVAL |
63 | |
64 | CV* |
65 | _get_code_ref(SV* self, SV* name) |
66 | CODE: |
67 | { |
68 | SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */ |
69 | HV* stash; |
70 | HE* he; |
71 | if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){ |
72 | croak("namespace() didn't return a HASH reference"); |
73 | } |
74 | stash = (HV*)SvRV(stash_ref); |
75 | he = hv_fetch_ent(stash, name, FALSE, 0U); |
76 | if(he){ |
77 | GV* const gv = (GV*)hv_iterval(stash, he); |
78 | if(isGV(gv)){ |
79 | RETVAL = GvCVu(gv); |
80 | } |
81 | else{ /* special constant or stub */ |
82 | STRLEN len; |
83 | const char* const pv = SvPV_const(name, len); |
84 | gv_init(gv, stash, pv, len, GV_ADDMULTI); |
85 | RETVAL = GvCVu(gv); |
86 | } |
87 | } |
88 | else{ |
89 | RETVAL = NULL; |
90 | } |
91 | |
92 | if(!RETVAL){ |
93 | XSRETURN_UNDEF; |
94 | } |
2591e962 |
95 | } |
96 | OUTPUT: |
97 | RETVAL |
98 | |
cccb83de |
99 | |
43165725 |
100 | MODULE = Mouse PACKAGE = Mouse::Meta::Class |
101 | |
102 | BOOT: |
103 | INSTALL_SIMPLE_READER(Class, roles); |
104 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id); |
105 | |
cccb83de |
106 | void |
107 | linearized_isa(SV* self) |
108 | PPCODE: |
109 | { |
110 | SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */ |
111 | AV* linearized_isa; |
112 | I32 len; |
113 | I32 i; |
114 | if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){ |
115 | croak("namespace() didn't return a HASH reference"); |
116 | } |
117 | linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref)); |
118 | len = AvFILLp(linearized_isa) + 1; |
119 | EXTEND(SP, len); |
120 | for(i = 0; i < len; i++){ |
121 | PUSHs(AvARRAY(linearized_isa)[i]); |
122 | } |
123 | } |
124 | |
43165725 |
125 | MODULE = Mouse PACKAGE = Mouse::Meta::Role |
126 | |
127 | BOOT: |
128 | INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles); |
129 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id); |
130 | |
43165725 |
131 | MODULE = Mouse PACKAGE = Mouse::Meta::Attribute |
132 | |
133 | BOOT: |
134 | /* readers */ |
135 | INSTALL_SIMPLE_READER(Attribute, name); |
136 | INSTALL_SIMPLE_READER(Attribute, associated_class); |
137 | INSTALL_SIMPLE_READER(Attribute, accessor); |
138 | INSTALL_SIMPLE_READER(Attribute, reader); |
139 | INSTALL_SIMPLE_READER(Attribute, writer); |
140 | INSTALL_SIMPLE_READER(Attribute, predicate); |
141 | INSTALL_SIMPLE_READER(Attribute, clearer); |
142 | INSTALL_SIMPLE_READER(Attribute, handles); |
143 | |
144 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, _is_metadata, is); |
145 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_required, required); |
146 | INSTALL_SIMPLE_READER(Attribute, default); |
147 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy, lazy); |
148 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy_build, lazy_build); |
149 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_weak_ref, weak_ref); |
150 | INSTALL_SIMPLE_READER(Attribute, init_arg); |
151 | INSTALL_SIMPLE_READER(Attribute, type_constraint); |
152 | INSTALL_SIMPLE_READER(Attribute, trigger); |
153 | INSTALL_SIMPLE_READER(Attribute, builder); |
154 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_auto_deref, auto_deref); |
155 | INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_coerce, coerce); |
156 | INSTALL_SIMPLE_READER(Attribute, documentation); |
157 | |
158 | /* predicates */ |
159 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_accessor, accessor); |
160 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_reader, reader); |
161 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_writer, writer); |
162 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_predicate, predicate); |
163 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_clearer, clearer); |
164 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_handles, handles); |
165 | |
166 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_default, default); |
167 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_type_constraint, type_constraint); |
168 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_trigger, trigger); |
169 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_builder, builder); |
170 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_documentation, documentation); |
171 | |
172 | MODULE = Mouse PACKAGE = Mouse::Meta::TypeConstraint |
173 | |
174 | BOOT: |
175 | INSTALL_SIMPLE_READER(TypeConstraint, name); |
176 | INSTALL_SIMPLE_READER(TypeConstraint, parent); |
177 | INSTALL_SIMPLE_READER(TypeConstraint, message); |
178 | |
179 | INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint); |
180 | INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */ |
181 | |
182 | INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion); |
183 | |