Rename a file
[gitmo/Mouse.git] / xs-src / Mouse.xs
CommitLineData
df6dd016 1#include "mouse.h"
2
cccb83de 3SV* mouse_package;
4SV* mouse_namespace;
5
df6dd016 6MODULE = Mouse PACKAGE = Mouse::Util
7
8PROTOTYPES: DISABLE
9
cccb83de 10BOOT:
11 mouse_package = newSVpvs_share("package");
12 mouse_namespace = newSVpvs_share("namespace");
13
14
df6dd016 15bool
16is_class_loaded(SV* sv = &PL_sv_undef)
17
18void
19get_code_info(CV* code)
20PREINIT:
21 GV* gv;
22 HV* stash;
23PPCODE:
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
30SV*
31get_code_package(CV* code)
32PREINIT:
33 HV* stash;
34CODE:
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 }
41OUTPUT:
42 RETVAL
43
cccb83de 44CV*
7d96ae4d 45get_code_ref(SV* package, SV* name)
cccb83de 46CODE:
47{
cccb83de 48 HV* stash;
49 HE* he;
7d96ae4d 50
51 if(!SvOK(package)){
52 croak("You must define a package name");
53 }
54 if(!SvOK(name)){
55 croak("You must define a subroutine name");
56 }
57
58 stash = gv_stashsv(package, FALSE);
59 if(!stash){
60 XSRETURN_UNDEF;
cccb83de 61 }
cccb83de 62 he = hv_fetch_ent(stash, name, FALSE, 0U);
63 if(he){
64 GV* const gv = (GV*)hv_iterval(stash, he);
7d96ae4d 65 if(!isGV(gv)){ /* special constant or stub */
cccb83de 66 STRLEN len;
67 const char* const pv = SvPV_const(name, len);
68 gv_init(gv, stash, pv, len, GV_ADDMULTI);
cccb83de 69 }
7d96ae4d 70 RETVAL = GvCVu(gv);
cccb83de 71 }
72 else{
73 RETVAL = NULL;
74 }
75
76 if(!RETVAL){
77 XSRETURN_UNDEF;
78 }
2591e962 79}
80OUTPUT:
81 RETVAL
82
cccb83de 83
7d96ae4d 84MODULE = Mouse PACKAGE = Mouse::Util::TypeConstraints
85
86void
87Item(SV* sv = &PL_sv_undef)
88ALIAS:
89 Any = MOUSE_TC_ANY
90 Item = MOUSE_TC_ITEM
91 Undef = MOUSE_TC_UNDEF
92 Defined = MOUSE_TC_DEFINED
93 Bool = MOUSE_TC_BOOL
94 Value = MOUSE_TC_VALUE
95 Ref = MOUSE_TC_REF
96 Str = MOUSE_TC_STR
97 Num = MOUSE_TC_NUM
98 Int = MOUSE_TC_INT
99 ScalarRef = MOUSE_TC_SCALAR_REF
100 ArrayRef = MOUSE_TC_ARRAY_REF
101 HashRef = MOUSE_TC_HASH_REF
102 CodeRef = MOUSE_TC_CODE_REF
103 GlobRef = MOUSE_TC_GLOB_REF
104 FileHandle = MOUSE_TC_FILEHANDLE
105 RegexpRef = MOUSE_TC_REGEXP_REF
106 Object = MOUSE_TC_OBJECT
107 ClassName = MOUSE_TC_CLASS_NAME
108 RoleName = MOUSE_TC_ROLE_NAME
109CODE:
110 SvGETMAGIC(sv);
111 ST(0) = boolSV( mouse_tc_check(aTHX_ ix, sv) );
112 XSRETURN(1);
113
114
115MODULE = Mouse PACKAGE = Mouse::Meta::Module
116
117BOOT:
118 INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package);
119 INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods);
120 INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes);
121
122HV*
123namespace(SV* self)
124CODE:
125{
3ea28db6 126 SV* const package = mouse_instance_get_slot(aTHX_ self, mouse_package);
7d96ae4d 127 if(!(package && SvOK(package))){
128 croak("No package name");
129 }
130 RETVAL = gv_stashsv(package, GV_ADDMULTI);
131}
132OUTPUT:
133 RETVAL
134
43165725 135MODULE = Mouse PACKAGE = Mouse::Meta::Class
136
137BOOT:
138 INSTALL_SIMPLE_READER(Class, roles);
139 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
140
cccb83de 141void
142linearized_isa(SV* self)
143PPCODE:
144{
145 SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
146 AV* linearized_isa;
147 I32 len;
148 I32 i;
149 if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
150 croak("namespace() didn't return a HASH reference");
151 }
152 linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref));
153 len = AvFILLp(linearized_isa) + 1;
154 EXTEND(SP, len);
155 for(i = 0; i < len; i++){
156 PUSHs(AvARRAY(linearized_isa)[i]);
157 }
158}
159
43165725 160MODULE = Mouse PACKAGE = Mouse::Meta::Role
161
162BOOT:
163 INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles);
164 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id);
165
43165725 166MODULE = Mouse PACKAGE = Mouse::Meta::Attribute
167
168BOOT:
169 /* readers */
170 INSTALL_SIMPLE_READER(Attribute, name);
171 INSTALL_SIMPLE_READER(Attribute, associated_class);
172 INSTALL_SIMPLE_READER(Attribute, accessor);
173 INSTALL_SIMPLE_READER(Attribute, reader);
174 INSTALL_SIMPLE_READER(Attribute, writer);
175 INSTALL_SIMPLE_READER(Attribute, predicate);
176 INSTALL_SIMPLE_READER(Attribute, clearer);
177 INSTALL_SIMPLE_READER(Attribute, handles);
178
179 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, _is_metadata, is);
180 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_required, required);
181 INSTALL_SIMPLE_READER(Attribute, default);
182 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy, lazy);
183 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy_build, lazy_build);
184 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_weak_ref, weak_ref);
185 INSTALL_SIMPLE_READER(Attribute, init_arg);
186 INSTALL_SIMPLE_READER(Attribute, type_constraint);
187 INSTALL_SIMPLE_READER(Attribute, trigger);
188 INSTALL_SIMPLE_READER(Attribute, builder);
189 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_auto_deref, auto_deref);
190 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_coerce, coerce);
191 INSTALL_SIMPLE_READER(Attribute, documentation);
192
193 /* predicates */
194 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_accessor, accessor);
195 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_reader, reader);
196 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_writer, writer);
197 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_predicate, predicate);
198 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_clearer, clearer);
199 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_handles, handles);
200
201 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_default, default);
202 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_type_constraint, type_constraint);
203 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_trigger, trigger);
204 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_builder, builder);
205 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_documentation, documentation);
206
93540011 207 newCONSTSUB(gv_stashpvs("Mouse::Meta::Attribute", TRUE), "accessor_metaclass",
208 newSVpvs("Mouse::Meta::Method::Accessor::XS"));
209
43165725 210MODULE = Mouse PACKAGE = Mouse::Meta::TypeConstraint
211
212BOOT:
213 INSTALL_SIMPLE_READER(TypeConstraint, name);
214 INSTALL_SIMPLE_READER(TypeConstraint, parent);
215 INSTALL_SIMPLE_READER(TypeConstraint, message);
216
217 INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint);
218 INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */
219
220 INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion);
93540011 221
222
223MODULE = Mouse PACKAGE = Mouse::Meta::Method::Accessor::XS
224
225BOOT:
226{
227 AV* const isa = get_av("Mouse::Meta::Method::Accessor::XS::ISA", TRUE);
228 av_push(isa, newSVpvs("Mouse::Meta::Method::Accessor"));
229}
230
231CV*
232_generate_accessor(klass, SV* attr, metaclass)
233CODE:
234{
235 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_accessor);
236}
237OUTPUT:
238 RETVAL
239
240CV*
241_generate_reader(klass, SV* attr, metaclass)
242CODE:
243{
244 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_reader);
245}
246OUTPUT:
247 RETVAL
248
249CV*
250_generate_writer(klass, SV* attr, metaclass)
251CODE:
252{
253 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_writer);
254}
255OUTPUT:
256 RETVAL
257
258CV*
259_generate_clearer(klass, SV* attr, metaclass)
260CODE:
261{
262 SV* const slot = mcall0s(attr, "name");
263 STRLEN len;
264 const char* const pv = SvPV_const(slot, len);
265 RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_clearer);
266}
267OUTPUT:
268 RETVAL
269
270CV*
271_generate_predicate(klass, SV* attr, metaclass)
272CODE:
273{
274 SV* const slot = mcall0s(attr, "name");
275 STRLEN len;
276 const char* const pv = SvPV_const(slot, len);
277 RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_predicate);
278}
279OUTPUT:
280 RETVAL
281