8 MODULE = Mouse PACKAGE = Mouse
13 mouse_package = newSVpvs_share("package");
14 mouse_namespace = newSVpvs_share("namespace");
15 mouse_methods = newSVpvs_share("methods");
16 mouse_name = newSVpvs_share("name");
18 MOUSE_CALL_BOOT(Mouse__Util);
19 MOUSE_CALL_BOOT(Mouse__Util__TypeConstraints);
20 MOUSE_CALL_BOOT(Mouse__Meta__Method__Accessor__XS);
23 MODULE = Mouse PACKAGE = Mouse::Meta::Module
26 INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package);
27 INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods);
28 INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes);
34 SV* const package = mouse_instance_get_slot(aTHX_ self, mouse_package);
35 if(!(package && SvOK(package))){
36 croak("No package name defined");
38 RETVAL = gv_stashsv(package, GV_ADDMULTI);
43 # ignore extra arguments for extensibility
45 add_method(SV* self, SV* name, SV* code, ...)
48 SV* const package = mouse_instance_get_slot(aTHX_ self, mouse_package); /* $self->{package} */
49 SV* const methods = mouse_instance_get_slot(aTHX_ self, mouse_methods); /* $self->{methods} */
53 if(!(package && SvOK(package))){
54 croak("No package name defined");
61 mouse_throw_error(self, NULL, "You must define a method name");
64 mouse_throw_error(self, NULL, "You must define a CODE reference");
68 if(SvTYPE(SvRV(code_ref)) != SVt_PVCV){
69 SV* sv = code_ref; /* used in tryAMAGICunDEREF */
70 SV** sp = &sv; /* used in tryAMAGICunDEREF */
71 tryAMAGICunDEREF(to_cv); /* try \&{$code} */
72 if(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV){
73 mouse_throw_error(self, NULL, "Not a CODE reference");
78 /* *{$package . '::' . $name} -> *gv */
79 gv = gv_fetchpv(form("%"SVf"::%"SVf, package, name), GV_ADDMULTI, SVt_PVCV);
80 if(GvCVu(gv)){ /* delete *slot{gv} to work around "redefine" warning */
81 SvREFCNT_dec(GvCV(gv));
84 sv_setsv_mg((SV*)gv, code_ref); /* *gv = $code_ref */
86 mouse_instance_set_slot(aTHX_ methods, name, code); /* $self->{methods}{$name} = $code */
88 /* TODO: name the CODE ref if it's anonymous */
89 //code_entity = (CV*)SvRV(code_ref);
90 //if(CvANON(code_entity)
91 // && CvGV(code_entity) /* a cv under construction has no gv */ ){
93 // CvGV(code_entity) = gv;
94 // CvANON_off(code_entity);
98 MODULE = Mouse PACKAGE = Mouse::Meta::Class
101 INSTALL_SIMPLE_READER(Class, roles);
102 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
105 linearized_isa(SV* self)
108 SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
112 if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
113 croak("namespace() didn't return a HASH reference");
115 linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref));
116 len = AvFILLp(linearized_isa) + 1;
118 for(i = 0; i < len; i++){
119 PUSHs(AvARRAY(linearized_isa)[i]);
123 MODULE = Mouse PACKAGE = Mouse::Meta::Role
126 INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles);
127 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id);
129 MODULE = Mouse PACKAGE = Mouse::Meta::Attribute
133 INSTALL_SIMPLE_READER(Attribute, name);
134 INSTALL_SIMPLE_READER(Attribute, associated_class);
135 INSTALL_SIMPLE_READER(Attribute, accessor);
136 INSTALL_SIMPLE_READER(Attribute, reader);
137 INSTALL_SIMPLE_READER(Attribute, writer);
138 INSTALL_SIMPLE_READER(Attribute, predicate);
139 INSTALL_SIMPLE_READER(Attribute, clearer);
140 INSTALL_SIMPLE_READER(Attribute, handles);
142 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, _is_metadata, is);
143 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_required, required);
144 INSTALL_SIMPLE_READER(Attribute, default);
145 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy, lazy);
146 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy_build, lazy_build);
147 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_weak_ref, weak_ref);
148 INSTALL_SIMPLE_READER(Attribute, init_arg);
149 INSTALL_SIMPLE_READER(Attribute, type_constraint);
150 INSTALL_SIMPLE_READER(Attribute, trigger);
151 INSTALL_SIMPLE_READER(Attribute, builder);
152 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_auto_deref, auto_deref);
153 INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_coerce, coerce);
154 INSTALL_SIMPLE_READER(Attribute, documentation);
157 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_accessor, accessor);
158 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_reader, reader);
159 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_writer, writer);
160 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_predicate, predicate);
161 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_clearer, clearer);
162 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_handles, handles);
164 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_default, default);
165 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_type_constraint, type_constraint);
166 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_trigger, trigger);
167 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_builder, builder);
168 INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_documentation, documentation);
170 newCONSTSUB(gv_stashpvs("Mouse::Meta::Attribute", TRUE), "accessor_metaclass",
171 newSVpvs("Mouse::Meta::Method::Accessor::XS"));
173 MODULE = Mouse PACKAGE = Mouse::Meta::TypeConstraint
176 INSTALL_SIMPLE_READER(TypeConstraint, name);
177 INSTALL_SIMPLE_READER(TypeConstraint, parent);
178 INSTALL_SIMPLE_READER(TypeConstraint, message);
180 INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint);
181 INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */
183 INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion);