ENTER;
SAVETMPS;
- xa = newAV();
+ xa = newAV();
mg = sv_magicext(SvRV(attr), (SV*)xa, PERL_MAGIC_ext, &mouse_xa_vtbl, NULL, 0);
SvREFCNT_dec(xa); /* refcnt++ in sv_magicext */
return value;
}
+/* checks $isa->does($does) */
static void
mouse_check_isa_does_does(pTHX_ SV* const klass, SV* const name, SV* const isa, SV* const does){
STRLEN len;
INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_auto_deref, auto_deref);
INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_coerce, coerce);
INSTALL_SIMPLE_READER(Attribute, documentation);
+ INSTALL_SIMPLE_READER(Attribute, insertion_order);
/* predicates */
INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_accessor, accessor);
_process_options(SV* klass, SV* name, HV* args)
CODE:
{
+ /* TODO: initialize 'xa' here */
SV** svp;
SV* tc = NULL;
/* taken from Class::MOP::Attribute::new */
- if(!SvOK(name)){
- mouse_throw_error(klass, NULL,
- "You must provide a name for the attribute");
- }
+ must_defined(name, "an attribute name");
svp = hv_fetchs(args, "init_arg", FALSE);
if(!svp){
svp = hv_fetchs(args, "builder", FALSE);
if(svp){
if(!SvOK(*svp)){
- mouse_throw_error(klass, NULL,
+ mouse_throw_error(klass, *svp,
"builder must be a defined scalar value which is a method name");
}
can_be_required = TRUE;
}
else if((svp = hv_fetchs(args, "default", FALSE))){
if(SvROK(*svp) && SvTYPE(SvRV(*svp)) != SVt_PVCV) {
- mouse_throw_error(klass, NULL,
+ mouse_throw_error(klass, *svp,
"References are not allowed as default values, you must "
"wrap the default of '%"SVf"' in a CODE reference "
"(ex: sub { [] } and not [])", name);
"without a default, builder, or an init_arg", name);
}
- /* taken from Mouse::Meta::Attribute->new and ->_process_args */
+ /* taken from Mouse::Meta::Attribute->new and ->_process_args */
svp = hv_fetchs(args, "is", FALSE);
if(svp){
else{
svp = hv_fetchs(args, "accessor", TRUE);
}
- sv_setsv(*svp, name);
+ if(!SvOK(*svp)) {
+ sv_setsv(*svp, name);
+ }
}
else if(strEQ(is, "bare")){
- /* do nothing, but don't complain (later) about missing methods */
+ /* do nothing, but might complain later about missing methods */
}
else{
mouse_throw_error(klass, NULL,