6 MODULE = Mouse PACKAGE = Mouse::Util
11 mouse_package = newSVpvs_share("package");
12 mouse_namespace = newSVpvs_share("namespace");
16 is_class_loaded(SV* sv = &PL_sv_undef)
19 get_code_info(CV* code)
24 if((gv = CvGV(code)) && isGV(gv) && (stash = GvSTASH(gv))){
26 mPUSHs(newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U));
27 mPUSHs(newSVpvn_share(GvNAME_get(gv), GvNAMELEN_get(gv), 0U));
31 get_code_package(CV* code)
35 if(CvGV(code) && isGV(CvGV(code)) && (stash = GvSTASH(CvGV(code)))){
36 RETVAL = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
45 get_code_ref(SV* package, SV* name)
52 croak("You must define a package name");
55 croak("You must define a subroutine name");
58 stash = gv_stashsv(package, FALSE);
62 he = hv_fetch_ent(stash, name, FALSE, 0U);
64 GV* const gv = (GV*)hv_iterval(stash, he);
65 if(!isGV(gv)){ /* special constant or stub */
67 const char* const pv = SvPV_const(name, len);
68 gv_init(gv, stash, pv, len, GV_ADDMULTI);
84 MODULE = Mouse PACKAGE = Mouse::Util::TypeConstraints
87 Item(SV* sv = &PL_sv_undef)
91 Undef = MOUSE_TC_UNDEF
92 Defined = MOUSE_TC_DEFINED
94 Value = MOUSE_TC_VALUE
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
111 ST(0) = boolSV( mouse_tc_check(aTHX_ ix, sv) );
115 MODULE = Mouse PACKAGE = Mouse::Meta::Module
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);
126 SV* const package = mouse_instance_get_slot(aTHX_ self, mouse_package);
127 if(!(package && SvOK(package))){
128 croak("No package name");
130 RETVAL = gv_stashsv(package, GV_ADDMULTI);
135 MODULE = Mouse PACKAGE = Mouse::Meta::Class
138 INSTALL_SIMPLE_READER(Class, roles);
139 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
142 linearized_isa(SV* self)
145 SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
149 if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
150 croak("namespace() didn't return a HASH reference");
152 linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref));
153 len = AvFILLp(linearized_isa) + 1;
155 for(i = 0; i < len; i++){
156 PUSHs(AvARRAY(linearized_isa)[i]);
160 MODULE = Mouse PACKAGE = Mouse::Meta::Role
163 INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles);
164 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id);
166 MODULE = Mouse PACKAGE = Mouse::Meta::Attribute
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);
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);
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);
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);
207 newCONSTSUB(gv_stashpvs("Mouse::Meta::Attribute", TRUE), "accessor_metaclass",
208 newSVpvs("Mouse::Meta::Method::Accessor::XS"));
210 MODULE = Mouse PACKAGE = Mouse::Meta::TypeConstraint
213 INSTALL_SIMPLE_READER(TypeConstraint, name);
214 INSTALL_SIMPLE_READER(TypeConstraint, parent);
215 INSTALL_SIMPLE_READER(TypeConstraint, message);
217 INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint);
218 INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */
220 INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion);
223 MODULE = Mouse PACKAGE = Mouse::Meta::Method::Accessor::XS
227 AV* const isa = get_av("Mouse::Meta::Method::Accessor::XS::ISA", TRUE);
228 av_push(isa, newSVpvs("Mouse::Meta::Method::Accessor"));
232 _generate_accessor(klass, SV* attr, metaclass)
235 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_accessor);
241 _generate_reader(klass, SV* attr, metaclass)
244 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_reader);
250 _generate_writer(klass, SV* attr, metaclass)
253 RETVAL = mouse_instantiate_xs_accessor(aTHX_ attr, mouse_xs_writer);
259 _generate_clearer(klass, SV* attr, metaclass)
262 SV* const slot = mcall0s(attr, "name");
264 const char* const pv = SvPV_const(slot, len);
265 RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_clearer);
271 _generate_predicate(klass, SV* attr, metaclass)
274 SV* const slot = mcall0s(attr, "name");
276 const char* const pv = SvPV_const(slot, len);
277 RETVAL = mouse_install_simple_accessor(aTHX_ NULL, pv, len, mouse_xs_simple_predicate);