10 plan skip_all => "no XSLoader" unless eval { require XSLoader };
12 plan skip_all => $@ unless eval {
14 Moose->XSLoader::load($Moose::VERSION);
24 sub attr_to_meta_instance {
26 return $attr->associated_class->get_meta_instance;
30 my %checks = map { $_ => $i++ } qw(
50 $checks{Bool} = $checks{Item} = $checks{Any};
51 $checks{Value} = $checks{Str};
56 return ( undef, 0, undef ) unless $tc;
58 if ( ref $tc eq 'Moose::Meta::TypeConstraint' or ref $tc eq 'Moose::Meta::TypeConstraint::Parameterizable') {
59 # builtin moose type #
60 return ( $tc, 1, $checks{$tc->name} );
61 } elsif ( $tc->isa("Moose::Meta::TypeConstraint::Class") ) {
62 return ( $tc, 2, $tc->class );
65 return ( $tc, 3, $tc->_compiled_type_constraint );
69 sub meta_instance_to_attr_descs {
73 $mi->associated_metaclass->name,
82 tc_params($_->type_constraint),
89 ]} $mi->get_all_attributes ]
94 ok( defined &Moose::XS::new_getter );
95 ok( defined &Moose::XS::new_setter );
96 ok( defined &Moose::XS::new_accessor );
97 ok( defined &Moose::XS::new_predicate );
103 has x => ( is => "rw", predicate => "has_x" );
104 has y => ( is => "ro" );
105 has z => ( reader => "z", setter => "set_z" );
106 has ref => ( is => "rw", weak_ref => 1 );
107 has i => ( isa => "Int", is => "rw" );
108 has s => ( isa => "Str", is => "rw" );
109 has a => ( isa => "ArrayRef", is => "rw" );
110 has o => ( isa => "Object", is => "rw" );
111 has f => ( isa => "Foo", is => "rw" );
112 has c => ( isa => "ClassName", is => "rw" );
114 # FIXME Regexp, ScalarRef, parametrized, filehandle
118 my ( $x, $y, $z, $ref, $a, $s, $i, $o, $f, $c ) = map { Foo->meta->get_attribute($_) } qw(x y z ref a s i o f c);
119 $x->Moose::XS::new_accessor("Foo::x");
120 $x->Moose::XS::new_predicate("Foo::has_x");
121 $y->Moose::XS::new_getter("Foo::y");
122 $z->Moose::XS::new_getter("Foo::z");
123 $z->Moose::XS::new_setter("Foo::set_z");
124 $ref->Moose::XS::new_accessor("Foo::ref");
125 $a->Moose::XS::new_accessor("Foo::a");
126 $s->Moose::XS::new_accessor("Foo::s");
127 $i->Moose::XS::new_accessor("Foo::i");
128 $o->Moose::XS::new_accessor("Foo::o");
129 $f->Moose::XS::new_accessor("Foo::f");
130 $c->Moose::XS::new_accessor("Foo::c");
136 my $foo = Foo->new( x => "ICKS", y => "WHY", z => "ZEE", ref => $ref );
138 is( $foo->x, "ICKS" );
139 is( $foo->y, "WHY" );
140 is( $foo->z, "ZEE" );
141 is( $foo->ref, $ref, );
143 lives_ok { $foo->x("YASE") };
145 is( $foo->x, "YASE" );
147 dies_ok { $foo->y("blah") };
149 is( $foo->y, "WHY" );
151 dies_ok { $foo->z("blah") };
153 is( $foo->z, "ZEE" );
155 lives_ok { $foo->set_z("new") };
157 is( $foo->z, "new" );
161 ok( !Foo->new->has_x );
165 is( $foo->ref(), undef );
171 is( $foo->ref, $ref, );
175 is( $foo->ref(), undef );
177 ok( !eval { $foo->a("not a ref"); 1 } );
178 ok( !eval { $foo->i(1.3); 1 } );
179 ok( !eval { $foo->s(undef); 1 } );
180 ok( !eval { $foo->o({}); 1 } );
181 ok( !eval { $foo->f(bless {}, "Bar"); 1 } );
182 ok( !eval { $foo->c("Horse"); 1 } );
184 ok( eval { $foo->a([]); 1 } );
185 ok( eval { $foo->i(3); 1 } );
186 ok( eval { $foo->s("foo"); 1 } );
187 ok( eval { $foo->o(bless {}, "Bar"); 1 } );
188 ok( eval { $foo->f(Foo->new); 1 } );
189 ok( eval { $foo->c("Foo"); 1 } );