File | /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Meta/Attribute/Native.pm |
Statements Executed | 34 |
Statement Execution Time | 111µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
0 | 0 | 0 | 0s | 0s | __ANON__[:26] | Moose::Meta::Attribute::Native::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Moose::Meta::Attribute::Native; | ||||
2 | |||||
3 | 1 | 600ns | our $VERSION = '0.98'; | ||
4 | 1 | 20µs | $VERSION = eval $VERSION; | ||
5 | 1 | 400ns | our $AUTHORITY = 'cpan:STEVAN'; | ||
6 | |||||
7 | 1 | 2µs | my @trait_names = qw(Bool Counter Number String Array Hash Code); | ||
8 | |||||
9 | 1 | 700ns | for my $trait_name (@trait_names) { | ||
10 | 7 | 4µs | my $trait_class = "Moose::Meta::Attribute::Native::Trait::$trait_name"; | ||
11 | 7 | 13µs | 7 | 366µs | my $meta = Class::MOP::Class->initialize( # spent 366µs making 7 calls to Class::MOP::Class::initialize, avg 52µs/call |
12 | "Moose::Meta::Attribute::Custom::Trait::$trait_name" | ||||
13 | ); | ||||
14 | 7 | 11µs | 7 | 443µs | if ($meta->find_method_by_name('register_implementation')) { # spent 443µs making 7 calls to Class::MOP::Class::find_method_by_name, avg 63µs/call |
15 | my $class = $meta->name->register_implementation; | ||||
16 | Moose->throw_error( | ||||
17 | "An implementation for $trait_name already exists " . | ||||
18 | "(found '$class' when trying to register '$trait_class')" | ||||
19 | ); | ||||
20 | } | ||||
21 | $meta->add_method(register_implementation => sub { | ||||
22 | # resolve_metatrait_alias will load classes anyway, but throws away | ||||
23 | # their error message; we WANT to die if there's a problem | ||||
24 | Class::MOP::load_class($trait_class); | ||||
25 | return $trait_class; | ||||
26 | 7 | 38µs | 7 | 237µs | }); # spent 237µs making 7 calls to Class::MOP::Mixin::HasMethods::add_method, avg 34µs/call |
27 | } | ||||
28 | |||||
29 | 1 | 21µs | 1; | ||
30 | |||||
31 | __END__ | ||||
32 | |||||
33 | =pod | ||||
34 | |||||
35 | =head1 NAME | ||||
36 | |||||
37 | Moose::Meta::Attribute::Native - Extend your attribute interfaces | ||||
38 | |||||
39 | =head1 SYNOPSIS | ||||
40 | |||||
41 | package MyClass; | ||||
42 | use Moose; | ||||
43 | |||||
44 | has 'mapping' => ( | ||||
45 | traits => [ 'Hash' ], | ||||
46 | is => 'rw', | ||||
47 | isa => 'HashRef[Str]', | ||||
48 | default => sub { {} }, | ||||
49 | handles => { | ||||
50 | exists_in_mapping => 'exists', | ||||
51 | ids_in_mapping => 'keys', | ||||
52 | get_mapping => 'get', | ||||
53 | set_mapping => 'set', | ||||
54 | set_quantity => [ set => 'quantity' ], | ||||
55 | }, | ||||
56 | ); | ||||
57 | |||||
58 | |||||
59 | # ... | ||||
60 | |||||
61 | my $obj = MyClass->new; | ||||
62 | $obj->set_quantity(10); # quantity => 10 | ||||
63 | $obj->set_mapping('foo', 4); # foo => 4 | ||||
64 | $obj->set_mapping('bar', 5); # bar => 5 | ||||
65 | $obj->set_mapping('baz', 6); # baz => 6 | ||||
66 | |||||
67 | |||||
68 | # prints 5 | ||||
69 | print $obj->get_mapping('bar') if $obj->exists_in_mapping('bar'); | ||||
70 | |||||
71 | # prints 'quantity, foo, bar, baz' | ||||
72 | print join ', ', $obj->ids_in_mapping; | ||||
73 | |||||
74 | =head1 DESCRIPTION | ||||
75 | |||||
76 | While L<Moose> attributes provide a way to name your accessors, readers, | ||||
77 | writers, clearers and predicates, this set of traits provides commonly | ||||
78 | used attribute helper methods for more specific types of data. | ||||
79 | |||||
80 | As seen in the L</SYNOPSIS>, you specify the data structure via the | ||||
81 | C<trait> parameter. Available traits are below; see L</METHOD PROVIDERS>. | ||||
82 | |||||
83 | This module used to exist as the L<MooseX::AttributeHelpers> extension. It was | ||||
84 | very commonly used, so we moved it into core Moose. Since this gave us a chance | ||||
85 | to change the interface, you will have to change your code or continue using | ||||
86 | the L<MooseX::AttributeHelpers> extension. L<MooseX::AttributeHelpers> should | ||||
87 | continue to work. | ||||
88 | |||||
89 | =head1 PARAMETERS | ||||
90 | |||||
91 | =head2 handles | ||||
92 | |||||
93 | This is like C<< handles >> in L<Moose/has>, but only HASH references are | ||||
94 | allowed. Keys are method names that you want installed locally, and values are | ||||
95 | methods from the method providers (below). Currying with delegated methods | ||||
96 | works normally for C<< handles >>. | ||||
97 | |||||
98 | =head1 METHOD PROVIDERS | ||||
99 | |||||
100 | =over | ||||
101 | |||||
102 | =item L<Number|Moose::Meta::Attribute::Native::Trait::Number> | ||||
103 | |||||
104 | Common numerical operations. | ||||
105 | |||||
106 | has 'integer' => ( | ||||
107 | traits => ['Number'], | ||||
108 | is => 'ro', | ||||
109 | isa => 'Int', | ||||
110 | default => 5, | ||||
111 | handles => { | ||||
112 | set => 'set', | ||||
113 | add => 'add', | ||||
114 | sub => 'sub', | ||||
115 | mul => 'mul', | ||||
116 | div => 'div', | ||||
117 | mod => 'mod', | ||||
118 | abs => 'abs', | ||||
119 | # ... | ||||
120 | } | ||||
121 | ); | ||||
122 | |||||
123 | =item L<String|Moose::Meta::Attribute::Native::Trait::String> | ||||
124 | |||||
125 | Common methods for string operations. | ||||
126 | |||||
127 | has 'text' => ( | ||||
128 | traits => ['String'], | ||||
129 | is => 'rw', | ||||
130 | isa => 'Str', | ||||
131 | default => q{}, | ||||
132 | handles => { | ||||
133 | add_text => 'append', | ||||
134 | replace_text => 'replace', | ||||
135 | # ... | ||||
136 | } | ||||
137 | ); | ||||
138 | |||||
139 | =item L<Counter|Moose::Meta::Attribute::Native::Trait::Counter> | ||||
140 | |||||
141 | Methods for incrementing and decrementing a counter attribute. | ||||
142 | |||||
143 | has 'counter' => ( | ||||
144 | traits => ['Counter'], | ||||
145 | is => 'ro', | ||||
146 | isa => 'Num', | ||||
147 | default => 0, | ||||
148 | handles => { | ||||
149 | inc_counter => 'inc', | ||||
150 | dec_counter => 'dec', | ||||
151 | reset_counter => 'reset', | ||||
152 | # ... | ||||
153 | } | ||||
154 | ); | ||||
155 | |||||
156 | =item L<Bool|Moose::Meta::Attribute::Native::Trait::Bool> | ||||
157 | |||||
158 | Common methods for boolean values. | ||||
159 | |||||
160 | has 'is_lit' => ( | ||||
161 | traits => ['Bool'], | ||||
162 | is => 'rw', | ||||
163 | isa => 'Bool', | ||||
164 | default => 0, | ||||
165 | handles => { | ||||
166 | illuminate => 'set', | ||||
167 | darken => 'unset', | ||||
168 | flip_switch => 'toggle', | ||||
169 | is_dark => 'not', | ||||
170 | # ... | ||||
171 | } | ||||
172 | ); | ||||
173 | |||||
174 | =item L<Hash|Moose::Meta::Attribute::Native::Trait::Hash> | ||||
175 | |||||
176 | Common methods for hash references. | ||||
177 | |||||
178 | has 'options' => ( | ||||
179 | traits => ['Hash'], | ||||
180 | is => 'ro', | ||||
181 | isa => 'HashRef[Str]', | ||||
182 | default => sub { {} }, | ||||
183 | handles => { | ||||
184 | set_option => 'set', | ||||
185 | get_option => 'get', | ||||
186 | has_option => 'exists', | ||||
187 | # ... | ||||
188 | } | ||||
189 | ); | ||||
190 | |||||
191 | =item L<Array|Moose::Meta::Attribute::Native::Trait::Array> | ||||
192 | |||||
193 | Common methods for array references. | ||||
194 | |||||
195 | has 'queue' => ( | ||||
196 | traits => ['Array'], | ||||
197 | is => 'ro', | ||||
198 | isa => 'ArrayRef[Str]', | ||||
199 | default => sub { [] }, | ||||
200 | handles => { | ||||
201 | add_item => 'push', | ||||
202 | next_item => 'shift', | ||||
203 | # ... | ||||
204 | } | ||||
205 | ); | ||||
206 | |||||
207 | =item L<Code|Moose::Meta::Attribute::Native::Trait::Code> | ||||
208 | |||||
209 | Common methods for code references. | ||||
210 | |||||
211 | has 'callback' => ( | ||||
212 | traits => ['Code'], | ||||
213 | is => 'ro', | ||||
214 | isa => 'CodeRef', | ||||
215 | default => sub { sub { 'called' } }, | ||||
216 | handles => { | ||||
217 | call => 'execute', | ||||
218 | # ... | ||||
219 | } | ||||
220 | ); | ||||
221 | |||||
222 | =back | ||||
223 | |||||
224 | =head1 BUGS | ||||
225 | |||||
226 | See L<Moose/BUGS> for details on reporting bugs. | ||||
227 | |||||
228 | =head1 AUTHOR | ||||
229 | |||||
230 | Stevan Little E<lt>stevan@iinteractive.comE<gt> | ||||
231 | |||||
232 | B<with contributions from:> | ||||
233 | |||||
234 | Robert (rlb3) Boone | ||||
235 | |||||
236 | Paul (frodwith) Driver | ||||
237 | |||||
238 | Shawn (Sartak) Moore | ||||
239 | |||||
240 | Chris (perigrin) Prather | ||||
241 | |||||
242 | Robert (phaylon) Sedlacek | ||||
243 | |||||
244 | Tom (dec) Lanyon | ||||
245 | |||||
246 | Yuval Kogman | ||||
247 | |||||
248 | Jason May | ||||
249 | |||||
250 | Cory (gphat) Watson | ||||
251 | |||||
252 | Florian (rafl) Ragwitz | ||||
253 | |||||
254 | Evan Carroll | ||||
255 | |||||
256 | Jesse (doy) Luehrs | ||||
257 | |||||
258 | Jay Hannah | ||||
259 | |||||
260 | Robert Buels | ||||
261 | |||||
262 | =head1 COPYRIGHT AND LICENSE | ||||
263 | |||||
264 | Copyright 2007-2009 by Infinity Interactive, Inc. | ||||
265 | |||||
266 | L<http://www.iinteractive.com> | ||||
267 | |||||
268 | This library is free software; you can redistribute it and/or modify | ||||
269 | it under the same terms as Perl itself. | ||||
270 | |||||
271 | =cut |