Commit | Line | Data |
daa0fd7d |
1 | package Moose::Manual::Delta; |
2 | |
3 | # ABSTRACT: Important Changes in Moose |
600f7f85 |
4 | |
daa0fd7d |
5 | __END__ |
600f7f85 |
6 | |
daa0fd7d |
7 | =pod |
600f7f85 |
8 | |
9 | =head1 DESCRIPTION |
10 | |
0f13f53c |
11 | This documents any important or noteworthy changes in Moose, with a |
bc68d61c |
12 | focus on things that affect backwards compatibility. This does duplicate data |
13 | from the F<Changes> file, but aims to provide more details and when possible |
14 | workarounds. |
0f13f53c |
15 | |
16 | Besides helping keep up with changes, you can also use this document |
17 | for finding the lowest version of Moose that supported a given |
18 | feature. If you encounter a problem and have a solution but don't see |
19 | it documented here, or think we missed an important feature, please |
20 | send us a patch. |
600f7f85 |
21 | |
d3a8251d |
22 | =head1 2.0700 |
23 | |
24 | =over 4 |
25 | |
26 | =item The non-arrayref forms of C<enum> and C<duck_type> have been deprecated |
27 | |
28 | Originally, C<enum> could be called like this: |
29 | |
30 | enum('MyType' => qw(foo bar baz)) |
31 | |
32 | This was confusing, however (since it was different from the syntax for |
33 | anonymous enum types), and it makes error checking more difficult (since you |
34 | can't tell just by looking whether C<enum('Foo', 'Bar', 'Baz')> was intended to |
35 | be a type named C<Foo> with elements of C<Bar> and C<Baz>, or if this was |
36 | actually a mistake where someone got the syntax for an anonymous enum type |
37 | wrong. This all also applies to C<duck_type>. |
38 | |
39 | Calling C<enum> and C<duck_type> with a list of arguments as described above |
40 | has been undocumented since version 0.93, and is now deprecated. You should |
41 | replace |
42 | |
43 | enum MyType => qw(foo bar baz); |
44 | |
45 | in your code with |
46 | |
47 | enum MyType => [qw(foo bar baz)]; |
48 | |
49 | =back |
50 | |
2c536958 |
51 | =head1 2.0600 |
5e116ff5 |
52 | |
c0a168fc |
53 | =over 4 |
54 | |
1e62ec3b |
55 | =item C<< ->init_meta >> is even less reliable at loading extensions |
56 | |
57 | Previously, calling C<< MooseX::Foo->init_meta(@_) >> (and nothing else) from |
58 | within your own C<init_meta> had a decent chance of doing something useful. |
59 | This was never supported behavior, and didn't always work anyway. Due to some |
60 | implementation adjustments, this now has a smaller chance of doing something |
61 | useful, which could break code that was expecting it to continue doing useful |
62 | things. Code that does this should instead just call |
63 | C<< MooseX::Foo->import({ into => $into }) >>. |
64 | |
5e116ff5 |
65 | =item All the Cookbook recipes have been renamed |
66 | |
67 | We've given them all descriptive names, rather than numbers. This makes it |
68 | easier to talk about them, and eliminates the need to renumber recipes in |
69 | order to reorder them or delete one. |
70 | |
c0a168fc |
71 | =back |
72 | |
2c536958 |
73 | =head1 2.0400 |
b1ea210b |
74 | |
75 | =over 4 |
76 | |
b5e5aaef |
77 | =item The parent of a union type is its components' nearest common ancestor |
78 | |
79 | Previously, union types considered all of their component types their parent |
5d3a1dd1 |
80 | types. This was incorrect because parent types are defined as types that must |
81 | be satisfied in order for the child type to be satisfied, but in a union, |
82 | validating as any parent type will validate against the entire union. This has |
83 | been changed to find the nearest common ancestor for all of its components. For |
84 | example, a union of "Int|ArrayRef[Int]" now has a parent of "Defined". |
b5e5aaef |
85 | |
3d4960c3 |
86 | =item Union types consider all members in the C<is_subtype_of> and C<is_a_type_of> methods |
87 | |
5d3a1dd1 |
88 | Previously, a union type would report itself as being of a subtype of a type if |
89 | I<any> of its member types were subtypes of that type. This was incorrect |
90 | because any value that passes a subtype constraint must also pass a parent |
91 | constraint. This has changed so that I<all> of its member types must be a |
92 | subtype of the specified type. |
3d4960c3 |
93 | |
ddbae99e |
94 | =item Enum types now work with just one value |
95 | |
96 | Previously, an C<enum> type needed to have two or more values. Nobody knew |
97 | why, so we fixed it. |
98 | |
04dacf19 |
99 | =item Methods defined in UNIVERSAL now appear in the MOP |
100 | |
101 | Any method introspection methods that look at methods from parent classes now |
102 | find methods defined in UNIVERSAL. This includes methods like C<< |
103 | $class->get_all_methods >> and C<< $class->find_method_by_name >>. |
104 | |
105 | This also means that you can now apply method modifiers to these methods. |
106 | |
b1ea210b |
107 | =item Hand-optimized type constraint code causes a deprecation warning |
108 | |
109 | If you provide an optimized sub ref for a type constraint, this now causes a |
110 | deprecation warning. Typically, this comes from passing an C<optimize_as> |
111 | parameter to C<subtype>, but it could also happen if you create a |
112 | L<Moose::Meta::TypeConstraint> object directly. |
113 | |
114 | Use the inlining feature (C<inline_as>) added in 2.0100 instead. |
115 | |
2f124a3e |
116 | =item C<Class::Load::load_class> and C<is_class_loaded> have been removed |
117 | |
118 | The C<Class::MOP::load_class> and C<Class::MOP::is_class_loaded> subroutines |
119 | are no longer documented, and will cause a deprecation warning in the |
120 | future. Moose now uses L<Class::Load> to provide this functionality, and you |
121 | should do so as well. |
122 | |
2aae65a7 |
123 | =back |
124 | |
125 | =head1 2.0205 |
126 | |
127 | =over 4 |
128 | |
7d7d2bef |
129 | =item Array and Hash native traits provide a C<shallow_clone> method |
130 | |
131 | The Array and Hash native traits now provide a "shallow_clone" method, which |
132 | will return a reference to a new container with the same contents as the |
133 | attribute's reference. |
134 | |
b1ea210b |
135 | =back |
136 | |
2c536958 |
137 | =head1 2.0200 |
7142d232 |
138 | |
139 | =over 4 |
140 | |
141 | =item Hand-optimized type constraint code is deprecated in favor of inlining |
142 | |
143 | Moose allows you to provide a hand-optimized version of a type constraint's |
144 | subroutine reference. This version allows type constraints to generate inline |
145 | code, and you should use this inlining instead of providing a hand-optimized |
146 | subroutine reference. |
147 | |
148 | This affects the C<optimize_as> sub exported by |
149 | L<Moose::Util::TypeConstraints>. Use C<inline_as> instead. |
150 | |
3bd65f1b |
151 | This will start warning in the 2.0300 release. |
7142d232 |
152 | |
1c3b1ed1 |
153 | =back |
154 | |
50698b2a |
155 | =head1 2.0002 |
156 | |
157 | =over 4 |
158 | |
159 | =item More useful type constraint error messages |
160 | |
161 | If you have L<Devel::PartialDump> version 0.14 or higher installed, Moose's |
162 | type constraint error messages will use it to display the invalid value, rather |
163 | than just displaying it directly. This will generally be much more useful. For |
164 | instance, instead of this: |
165 | |
166 | Attribute (foo) does not pass the type constraint because: Validation failed for 'ArrayRef[Int]' with value ARRAY(0x275eed8) |
167 | |
168 | the error message will instead look like |
169 | |
170 | Attribute (foo) does not pass the type constraint because: Validation failed for 'ArrayRef[Int]' with value [ "a" ] |
171 | |
172 | Note that L<Devel::PartialDump> can't be made a direct dependency at the |
173 | moment, because it uses Moose itself, but we're considering options to make |
174 | this easier. |
175 | |
176 | =back |
177 | |
6adb18d8 |
178 | =head1 2.0000 |
13eb2af6 |
179 | |
180 | =over 4 |
181 | |
182 | =item Roles have their own default attribute metaclass |
183 | |
184 | Previously, when a role was applied to a class, it would use the attribute |
185 | metaclass defined in the class when copying over the attributes in the role. |
186 | This was wrong, because for instance, using L<MooseX::FollowPBP> in the class |
187 | would end up renaming all of the accessors generated by the role, some of which |
188 | may be being called in the role, causing it to break. Roles now keep track of |
189 | their own attribute metaclass to use by default when being applied to a class |
190 | (defaulting to Moose::Meta::Attribute). This is modifiable using |
191 | L<Moose::Util::MetaRole> by passing the C<applied_attribute> key to the |
192 | C<role_metaroles> option, as in: |
193 | |
194 | Moose::Util::MetaRole::apply_metaroles( |
195 | for => __PACKAGE__, |
196 | class_metaroles => { |
197 | attribute => ['My::Meta::Role::Attribute'], |
198 | }, |
199 | role_metaroles => { |
200 | applied_attribute => ['My::Meta::Role::Attribute'], |
201 | }, |
202 | ); |
203 | |
6adb18d8 |
204 | =item Class::MOP has been folded into the Moose dist |
205 | |
206 | Moose and Class::MOP are tightly related enough that they have always had to be |
207 | kept pretty closely in step in terms of versions. Making them into a single |
208 | dist should simplify the upgrade process for users, as it should no longer be |
209 | possible to upgrade one without the other and potentially cause issues. No |
210 | functionality has changed, and this should be entirely transparent. |
211 | |
212 | =item Moose's conflict checking is more robust and useful |
213 | |
214 | There are two parts to this. The most useful one right now is that Moose will |
215 | ship with a C<moose-outdated> script, which can be run at any point to list the |
216 | modules which are installed that conflict with the installed version of Moose. |
217 | After upgrading Moose, running C<moose-outdated | cpanm> should be sufficient |
218 | to ensure that all of the Moose extensions you use will continue to work. |
219 | |
220 | The other part is that Moose's C<META.json> file will also specify the |
1b387fd1 |
221 | conflicts under the C<x_conflicts> key. We are working with the Perl tool chain |
6adb18d8 |
222 | developers to try to get conflicts support added to CPAN clients, and if/when |
223 | that happens, the metadata already exists, and so the conflict checking will |
224 | become automatic. |
225 | |
14bda293 |
226 | =item Most deprecated APIs/features are slated for removal in Moose 2.0200 |
227 | |
228 | Most of the deprecated APIs and features in Moose will start throwing an error |
229 | in Moose 2.0200. Some of the features will go away entirely, and some will |
230 | simply throw an error. |
231 | |
232 | The things on the chopping block are: |
233 | |
234 | =over 8 |
235 | |
236 | =item * Old public methods in Class::MOP and Moose |
237 | |
238 | This includes things like C<< Class::MOP::Class->get_attribute_map >>, C<< |
239 | Class::MOP::Class->construct_instance >>, and many others. These were |
bc68d61c |
240 | deprecated in L<Class::MOP> 0.80_01, released on April 5, 2009. |
14bda293 |
241 | |
242 | These methods will be removed entirely in Moose 2.0200. |
243 | |
244 | =item * Old public functions in Class::MOP |
245 | |
246 | This include C<Class::MOP::subname>, C<Class::MOP::in_global_destruction>, and |
247 | the C<Class::MOP::HAS_ISAREV> constant. The first two were deprecated in 0.84, |
248 | and the last in 0.80. Class::MOP 0.84 was released on May 12, 2009. |
249 | |
250 | These functions will be removed entirely in Moose 2.0200. |
251 | |
252 | =item * The C<alias> and C<excludes> option for role composition |
253 | |
254 | These were renamed to C<-alias> and C<-excludes> in Moose 0.89, released on |
255 | August 13, 2009. |
256 | |
257 | Passing these will throw an error in Moose 2.0200. |
258 | |
259 | =item * The old L<Moose::Util::MetaRole> API |
260 | |
261 | This include the C<apply_metaclass_roles()> function, as well as passing the |
262 | C<for_class> or any key ending in C<_roles> to C<apply_metaroles()>. This was |
263 | deprecated in Moose 0.93_01, released on January 4, 2010. |
264 | |
265 | These will all throw an error in Moose 2.0200. |
266 | |
267 | =item * Passing plain lists to C<type()> or C<subtype()> |
268 | |
269 | The old API for these functions allowed you to pass a plain list of parameter, |
270 | rather than a list of hash references (which is what C<as()>, C<where>, |
271 | etc. return). This was deprecated in Moose 0.71_01, released on February 22, |
272 | 2009. |
273 | |
274 | This will throw an error in Moose 2.0200. |
275 | |
276 | =item * The Role subtype |
277 | |
278 | This subtype was deprecated in Moose 0.84, released on June 26, 2009. |
279 | |
280 | This will be removed entirely in Moose 2.0200. |
281 | |
282 | =back |
283 | |
8ab76136 |
284 | =back |
285 | |
286 | =head1 1.21 |
287 | |
288 | =over 4 |
289 | |
d4985a66 |
290 | =item * New release policy |
291 | |
292 | As of the 2.0 release, Moose now has an official release and support policy, |
293 | documented in L<Moose::Manual::Support>. All API changes will now go through a |
294 | deprecation cycle of at least one year, after which the deprecated API can be |
295 | removed. Deprecations and removals will only happen in major releases. |
296 | |
9db7bbff |
297 | In between major releases, we will still make minor releases to add new |
d4985a66 |
298 | features, fix bugs, update documentation, etc. |
299 | |
13eb2af6 |
300 | =back |
301 | |
9796131f |
302 | =head1 1.16 |
303 | |
304 | =over 4 |
305 | |
306 | =item Configurable stacktraces |
307 | |
308 | Classes which use the L<Moose::Error::Default> error class can now have |
309 | stacktraces disabled by setting the C<MOOSE_ERROR_STYLE> env var to C<croak>. |
310 | This is experimental, fairly incomplete, and won't work in all cases (because |
311 | Moose's error system in general is all of these things), but this should allow |
312 | for reducing at least some of the verbosity in most cases. |
313 | |
314 | =back |
315 | |
adff0aa1 |
316 | =head1 1.15 |
d6ce97b9 |
317 | |
318 | =over 4 |
319 | |
adff0aa1 |
320 | =item Native Delegations |
d6ce97b9 |
321 | |
322 | In previous versions of Moose, the Native delegations were created as |
323 | closures. The generated code was often quite slow compared to doing the same |
324 | thing by hand. For example, the Array's push delegation ended up doing |
325 | something like this: |
326 | |
327 | push @{ $self->$reader() }, @_; |
328 | |
329 | If the attribute was created without a reader, the C<$reader> sub reference |
330 | followed a very slow code path. Even with a reader, this is still slower than |
331 | it needs to be. |
332 | |
333 | Native delegations are now generated as inline code, just like other |
334 | accessors, so we can access the slot directly. |
335 | |
336 | In addition, native traits now do proper constraint checking in all cases. In |
337 | particular, constraint checking has been improved for array and hash |
338 | references. Previously, only the I<contained> type (the C<Str> in |
339 | C<HashRef[Str]>) would be checked when a new value was added to the |
340 | collection. However, if there was a constraint that applied to the whole |
341 | value, this was never checked. |
342 | |
343 | In addition, coercions are now called on the whole value. |
344 | |
27719606 |
345 | The delegation methods now do more argument checking. All of the methods check |
346 | that a valid number of arguments were passed to the method. In addition, the |
347 | delegation methods check that the arguments are sane (array indexes, hash |
348 | keys, numbers, etc.) when applicable. We have tried to emulate the behavior of |
349 | Perl builtins as much as possible. |
350 | |
d6ce97b9 |
351 | Finally, triggers are called whenever the value of the attribute is changed by |
352 | a Native delegation. |
353 | |
c99ddeb7 |
354 | These changes are only likely to break code in a few cases. |
355 | |
ca8d6244 |
356 | The inlining code may or may not preserve the original reference when changes |
c99ddeb7 |
357 | are made. In some cases, methods which change the value may replace it |
358 | entirely. This will break tied values. |
359 | |
360 | If you have a typed arrayref or hashref attribute where the type enforces a |
361 | constraint on the whole collection, this constraint will now be checked. It's |
362 | possible that code which previously ran without errors will now cause the |
363 | constraint to fail. However, presumably this is a good thing ;) |
d6ce97b9 |
364 | |
27719606 |
365 | If you are passing invalid arguments to a delegation which were previously |
ca8d6244 |
366 | being ignored, these calls will now fail. |
27719606 |
367 | |
c99ddeb7 |
368 | If your code relied on the trigger only being called for a regular writer, |
369 | that may cause problems. |
d6ce97b9 |
370 | |
371 | As always, you are encouraged to test before deploying the latest version of |
372 | Moose to production. |
373 | |
c787d26e |
374 | =item Defaults is and default for String, Counter, and Bool |
375 | |
d21ebae8 |
376 | A few native traits (String, Counter, Bool) provide default values of "is" and |
c787d26e |
377 | "default" when you created an attribute. Allowing them to provide these values |
378 | is now deprecated. Supply the value yourself when creating the attribute. |
379 | |
a2084f68 |
380 | =item The C<meta> method |
381 | |
382 | Moose and Class::MOP have been cleaned up internally enough to make the |
383 | C<meta> method that you get by default optional. C<use Moose> and |
384 | C<use Moose::Role> now can take an additional C<-meta_name> option, which |
385 | tells Moose what name to use when installing the C<meta> method. Passing |
386 | C<undef> to this option suppresses generation of the C<meta> method |
387 | entirely. This should be useful for users of modules which also use a C<meta> |
388 | method or function, such as L<Curses> or L<Rose::DB::Object>. |
389 | |
d6ce97b9 |
390 | =back |
391 | |
aee0741b |
392 | =head1 1.09 |
393 | |
7dacb294 |
394 | =over 4 |
395 | |
4c7d1018 |
396 | =item All deprecated features now warn |
397 | |
398 | Previously, deprecation mostly consisted of simply saying "X is deprecated" in |
399 | the Changes file. We were not very consistent about actually warning. Now, all |
400 | deprecated features still present in Moose actually give a warning. The |
401 | warning is issued once per calling package. See L<Moose::Deprecated> for more |
402 | details. |
403 | |
2b54d2a6 |
404 | =item You cannot pass C<< coerce => 1 >> unless the attribute's type constraint has a coercion |
405 | |
406 | Previously, this was accepted, and it sort of worked, except that if you |
407 | attempted to set the attribute after the object was created, you would get a |
408 | runtime error. |
409 | |
aa6da652 |
410 | Now you will get a warning when you attempt to define the attribute. |
2b54d2a6 |
411 | |
aee0741b |
412 | =item C<no Moose>, C<no Moose::Role>, and C<no Moose::Exporter> no longer unimport strict and warnings |
413 | |
414 | This change was made in 1.05, and has now been reverted. We don't know if the |
dee8c866 |
415 | user has explicitly loaded strict or warnings on their own, and unimporting |
416 | them is just broken in that case. |
aee0741b |
417 | |
59caebc4 |
418 | =item Reversed logic when defining which options can be changed |
7782e1da |
419 | |
da7efd4c |
420 | L<Moose::Meta::Attribute> now allows all options to be changed in an |
421 | overridden attribute. The previous behaviour required each option to be |
422 | whitelisted using the C<legal_options_for_inheritance> method. This method has |
423 | been removed, and there is a new method, C<illegal_options_for_inheritance>, |
424 | which can now be used to prevent certain options from being changeable. |
7782e1da |
425 | |
da7efd4c |
426 | In addition, we only throw an error if the illegal option is actually |
427 | changed. If the superclass didn't specify this option at all when defining the |
428 | attribute, the subclass version can still add it as an option. |
dede9732 |
429 | |
430 | Example of overriding this in an attribute trait: |
7782e1da |
431 | |
dede9732 |
432 | package Bar::Meta::Attribute; |
433 | use Moose::Role; |
7782e1da |
434 | |
435 | has 'my_illegal_option' => ( |
da7efd4c |
436 | isa => 'CodeRef', |
437 | is => 'rw', |
7782e1da |
438 | ); |
439 | |
440 | around illegal_options_for_inheritance => sub { |
da7efd4c |
441 | return ( shift->(@_), qw/my_illegal_option/ ); |
7782e1da |
442 | }; |
443 | |
7dacb294 |
444 | =back |
445 | |
e462f6f3 |
446 | =head1 1.05 |
447 | |
a19ae3d7 |
448 | =over 4 |
449 | |
450 | =item L<Moose::Object/BUILD> methods are now called when calling C<new_object> |
451 | |
452 | Previously, C<BUILD> methods would only be called from C<Moose::Object::new>, |
453 | but now they are also called when constructing an object via |
454 | C<Moose::Meta::Class::new_object>. C<BUILD> methods are an inherent part of the |
455 | object construction process, and this should make C<< $meta->new_object >> |
456 | actually usable without forcing people to use C<< $meta->name->new >>. |
457 | |
2fee26f1 |
458 | =item C<no Moose>, C<no Moose::Role>, and C<no Moose::Exporter> now unimport strict and warnings |
459 | |
460 | In the interest of having C<no Moose> clean up everything that C<use Moose> |
461 | does in the calling scope, C<no Moose> (as well as all other |
462 | L<Moose::Exporter>-using modules) now unimports strict and warnings. |
463 | |
f46a74bf |
464 | =item Metaclass compatibility checking and fixing should be much more robust |
465 | |
466 | The L<metaclass compatibility|Moose/METACLASS COMPATIBILITY AND MOOSE> checking |
467 | and fixing algorithms have been completely rewritten, in both Class::MOP and |
468 | Moose. This should resolve many confusing errors when dealing with non-Moose |
469 | inheritance and with custom metaclasses for things like attributes, |
918b5cef |
470 | constructors, etc. For correct code, the only thing that should require a |
471 | change is that custom error metaclasses must now inherit from |
472 | L<Moose::Error::Default>. |
f46a74bf |
473 | |
a19ae3d7 |
474 | =back |
475 | |
8ff79890 |
476 | =head1 1.02 |
477 | |
478 | =over 4 |
479 | |
480 | =item Moose::Meta::TypeConstraint::Class is_subtype_of behavior |
481 | |
482 | Earlier versions of L<is_subtype_of|Moose::Meta::TypeConstraint::Class/is_subtype_of> |
483 | would incorrectly return true when called with itself, its own TC name or |
484 | its class name as an argument. (i.e. $foo_tc->is_subtype_of('Foo') == 1) This |
485 | behavior was a caused by C<isa> being checked before the class name. The old |
486 | behavior can be accessed with L<is_type_of|Moose::Meta::TypeConstraint::Class/is_type_of> |
487 | |
488 | =back |
489 | |
12885414 |
490 | =head1 1.00 |
491 | |
492 | =over 4 |
493 | |
494 | =item Moose::Meta::Attribute::Native::Trait::Code no longer creates reader methods by default |
495 | |
496 | Earlier versions of L<Moose::Meta::Attribute::Native::Trait::Code> created |
497 | read-only accessors for the attributes it's been applied to, even if you didn't |
498 | ask for it with C<< is => 'ro' >>. This incorrect behaviour has now been fixed. |
499 | |
500 | =back |
501 | |
775666aa |
502 | =head1 0.95 |
503 | |
504 | =over 4 |
505 | |
506 | =item Moose::Util add_method_modifier behavior |
507 | |
508 | add_method_modifier (and subsequently the sugar functions Moose::before, |
509 | Moose::after, and Moose::around) can now accept arrayrefs, with the same |
510 | behavior as lists. Types other than arrayref and regexp result in an error. |
511 | |
512 | =back |
513 | |
5b7b27e2 |
514 | =head1 0.93_01 and 0.94 |
515 | |
516 | =over 4 |
517 | |
f785aad8 |
518 | =item Moose::Util::MetaRole API has changed |
519 | |
520 | The C<apply_metaclass_roles> function is now called C<apply_metaroles>. The |
521 | way arguments are supplied has been changed to force you to distinguish |
522 | between metaroles applied to L<Moose::Meta::Class> (and helpers) versus |
523 | L<Moose::Meta::Role>. |
524 | |
525 | The old API still works, but will warn in a future release, and eventually be |
526 | removed. |
527 | |
528 | =item Moose::Meta::Role has real attributes |
529 | |
530 | The attributes returned by L<Moose::Meta::Role> are now instances of the |
531 | L<Moose::Meta::Role::Attribute> class, instead of bare hash references. |
532 | |
5b7b27e2 |
533 | =item "no Moose" now removes C<blessed> and C<confess> |
534 | |
535 | Moose is now smart enough to know exactly what it exported, even when it |
536 | re-exports functions from other packages. When you unimport Moose, it will |
537 | remove these functions from your namespace unless you I<also> imported them |
538 | directly from their respective packages. |
539 | |
540 | If you have a C<no Moose> in your code I<before> you call C<blessed> or |
541 | C<confess>, your code will break. You can either move the C<no Moose> call |
542 | later in your code, or explicitly import the relevant functions from the |
543 | packages that provide them. |
544 | |
545 | =item L<Moose::Exporter> is smarter about unimporting re-exports |
546 | |
547 | The change above comes from a general improvement to L<Moose::Exporter>. It |
548 | will now unimport any function it exports, even if that function is a |
549 | re-export from another package. |
550 | |
f427b505 |
551 | =item Attributes in roles can no longer override class attributes with "+foo" |
552 | |
553 | Previously, this worked more or less accidentally, because role attributes |
554 | weren't objects. This was never documented, but a few MooseX modules took |
555 | advantage of this. |
556 | |
557 | =item The composition_class_roles attribute in L<Moose::Meta::Role> is now a method |
558 | |
559 | This was done to make it possible for roles to alter the the list of |
560 | composition class roles by applying a method modifiers. Previously, this was |
561 | an attribute and MooseX modules override it. Since that no longer works, this |
562 | was made a method. |
563 | |
564 | This I<should> be an attribute, so this may switch back to being an attribute |
565 | in the future if we can figure out how to make this work. |
566 | |
5b7b27e2 |
567 | =back |
568 | |
c378a61a |
569 | =head1 0.93 |
570 | |
571 | =over 4 |
572 | |
573 | =item Calling $object->new() is no longer deprecated |
574 | |
76c89056 |
575 | We decided to undeprecate this. Now it just works. |
c378a61a |
576 | |
d99ec58b |
577 | =item Both C<get_method_map> and C<get_attribute_map> is deprecated |
fa6da135 |
578 | |
d99ec58b |
579 | These metaclass methods were never meant to be public, and they are both now |
580 | deprecated. The work around if you still need the functionality they provided |
581 | is to iterate over the list of names manually. |
fa6da135 |
582 | |
583 | my %fields = map { $_ => $meta->get_attribute($_) } $meta->get_attribute_list; |
584 | |
d99ec58b |
585 | This was actually a change in L<Class::MOP>, but this version of Moose |
586 | requires a version of L<Class::MOP> that includes said change. |
587 | |
c378a61a |
588 | =back |
589 | |
b98ef150 |
590 | =head1 0.90 |
871f82f8 |
591 | |
c985327a |
592 | =over 4 |
593 | |
93ef4ba1 |
594 | =item Added Native delegation for Code refs |
595 | |
596 | See L<Moose::Meta::Attribute::Native::Trait::Code> for details. |
597 | |
3f5ff7d0 |
598 | =item Calling $object->new() is deprecated |
599 | |
600 | Moose has long supported this, but it's never really been documented, and we |
601 | don't think this is a good practice. If you want to construct an object from |
602 | an existing object, you should provide some sort of alternate constructor like |
603 | C<< $object->clone >>. |
604 | |
605 | Calling C<< $object->new >> now issues a warning, and will be an error in a |
606 | future release. |
607 | |
19e60fdd |
608 | =item Moose no longer warns if you call C<make_immutable> for a class with mutable ancestors |
609 | |
610 | While in theory this is a good thing to warn about, we found so many |
611 | exceptions to this that doing this properly became quite problematic. |
612 | |
93ef4ba1 |
613 | =back |
614 | |
def57e8d |
615 | =head1 0.89_02 |
93ef4ba1 |
616 | |
617 | =over 4 |
4f0d4488 |
618 | |
871f82f8 |
619 | =item New Native delegation methods from L<List::Util> and L<List::MoreUtils> |
620 | |
621 | In particular, we now have C<reduce>, C<shuffle>, C<uniq>, and C<natatime>. |
622 | |
3023f1e4 |
623 | =item The Moose::Exporter with_caller feature is now deprecated |
624 | |
625 | Use C<with_meta> instead. The C<with_caller> option will start warning in a |
626 | future release. |
627 | |
9b9a5a07 |
628 | =item Moose now warns if you call C<make_immutable> for a class with mutable ancestors |
629 | |
630 | This is dangerous because modifying a class after a subclass has been |
90b20bd6 |
631 | immutabilized will lead to incorrect results in the subclass, due to inlining, |
9b9a5a07 |
632 | caching, etc. This occasionally happens accidentally, when a class loads one |
633 | of its subclasses in the middle of its class definition, so pointing out that |
634 | this may cause issues should be helpful. Metaclasses (classes that inherit |
635 | from L<Class::MOP::Object>) are currently exempt from this check, since at the |
90b20bd6 |
636 | moment we aren't very consistent about which metaclasses we immutabilize. |
9b9a5a07 |
637 | |
bce5d4a5 |
638 | =item C<enum> and C<duck_type> now take arrayrefs for all forms |
639 | |
640 | Previously, calling these functions with a list would take the first element of |
641 | the list as the type constraint name, and use the remainder as the enum values |
642 | or method names. This makes the interface inconsistent with the anon-type forms |
643 | of these functions (which must take an arrayref), and a free-form list where |
644 | the first value is sometimes special is hard to validate (and harder to give |
645 | reasonable error messages for). These functions have been changed to take |
646 | arrayrefs in all their forms - so, C<< enum 'My::Type' => [qw(foo bar)] >> is |
647 | now the preferred way to create an enum type constraint. The old syntax still |
648 | works for now, but it will hopefully be deprecated and removed in a future |
649 | release. |
650 | |
871f82f8 |
651 | =back |
652 | |
def57e8d |
653 | =head1 0.89_01 |
a3d98218 |
654 | |
af44c00c |
655 | L<Moose::Meta::Attribute::Native> has been moved into the Moose core from |
a3d98218 |
656 | L<MooseX::AttributeHelpers>. Major changes include: |
657 | |
ebaaa391 |
658 | =over 4 |
a3d98218 |
659 | |
660 | =item C<traits>, not C<metaclass> |
661 | |
93ced2bd |
662 | Method providers are only available via traits. |
a3d98218 |
663 | |
664 | =item C<handles>, not C<provides> or C<curries> |
665 | |
93ced2bd |
666 | The C<provides> syntax was like core Moose C<< handles => HASHREF >> |
667 | syntax, but with the keys and values reversed. This was confusing, |
668 | and AttributeHelpers now uses C<< handles => HASHREF >> in a way that |
669 | should be intuitive to anyone already familiar with how it is used for |
670 | other attributes. |
a3d98218 |
671 | |
93ced2bd |
672 | The C<curries> functionality provided by AttributeHelpers has been |
673 | generalized to apply to all cases of C<< handles => HASHREF >>, though |
674 | not every piece of functionality has been ported (currying with a |
675 | CODEREF is not supported). |
a3d98218 |
676 | |
1853a27e |
677 | =item C<empty> is now C<is_empty>, and means empty, not non-empty |
af44c00c |
678 | |
679 | Previously, the C<empty> method provided by Arrays and Hashes returned true if |
680 | the attribute was B<not> empty (no elements). Now it returns true if the |
1853a27e |
681 | attribute B<is> empty. It was also renamed to C<is_empty>, to reflect this. |
af44c00c |
682 | |
9a14bd29 |
683 | =item C<find> was renamed to C<first>, and C<first> and C<last> were removed |
28b96142 |
684 | |
685 | L<List::Util> refers to the functionality that we used to provide under C<find> |
686 | as L<first|List::Util/first>, so that will likely be more familiar (and will |
9a14bd29 |
687 | fit in better if we decide to add more List::Util functions). C<first> and |
688 | C<last> were removed, since their functionality is easily duplicated with |
689 | curries of C<get>. |
28b96142 |
690 | |
691 | =item Helpers that take a coderef of one argument now use C<$_> |
692 | |
693 | Subroutines passed as the first argument to C<first>, C<map>, and C<grep> now |
694 | receive their argument in C<$_> rather than as a parameter to the subroutine. |
695 | Helpers that take a coderef of two or more arguments remain using the argument |
696 | list (there are technical limitations to using C<$a> and C<$b> like C<sort> |
697 | does). |
698 | |
af44c00c |
699 | See L<Moose::Meta::Attribute::Native> for the new documentation. |
a3d98218 |
700 | |
ebaaa391 |
701 | =back |
702 | |
85e2b15a |
703 | The C<alias> and C<excludes> role parameters have been renamed to C<-alias> |
704 | and C<-excludes>. The old names still work, but new code should use the new |
705 | names, and eventually the old ones will be deprecated and removed. |
706 | |
def57e8d |
707 | =head1 0.89 |
4ada9618 |
708 | |
8a8856de |
709 | C<< use Moose -metaclass => 'Foo' >> now does alias resolution, just like |
710 | C<-traits> (and the C<metaclass> and C<traits> options to C<has>). |
711 | |
27f2f43f |
712 | Added two functions C<meta_class_alias> and C<meta_attribute_alias> to |
713 | L<Moose::Util>, to simplify aliasing metaclasses and metatraits. This is |
714 | a wrapper around the old |
715 | |
716 | package Moose::Meta::Class::Custom::Trait::FooTrait; |
717 | sub register_implementation { 'My::Meta::Trait' } |
718 | |
719 | way of doing this. |
720 | |
def57e8d |
721 | =head1 0.84 |
4831e2de |
722 | |
9f52cce5 |
723 | When an attribute generates I<no> accessors, we now warn. This is to help |
724 | users who forget the C<is> option. If you really do not want any accessors, |
3de02fd8 |
725 | you can use C<< is => 'bare' >>. You can maintain back compat with older |
726 | versions of Moose by using something like: |
727 | |
728 | ($Moose::VERSION >= 0.84 ? is => 'bare' : ()) |
9f52cce5 |
729 | |
730 | When an accessor overwrites an existing method, we now warn. To work around |
731 | this warning (if you really must have this behavior), you can explicitly |
732 | remove the method before creating it as an accessor: |
733 | |
734 | sub foo {} |
735 | |
736 | __PACKAGE__->meta->remove_method('foo'); |
737 | |
738 | has foo => ( |
739 | is => 'ro', |
740 | ); |
741 | |
742 | When an unknown option is passed to C<has>, we now warn. You can silence |
743 | the warning by fixing your code. :) |
744 | |
4831e2de |
745 | The C<Role> type has been deprecated. On its own, it was useless, |
746 | since it just checked C<< $object->can('does') >>. If you were using |
747 | it as a parent type, just call C<role_type('Role::Name')> to create an |
748 | appropriate type instead. |
749 | |
def57e8d |
750 | =head1 0.78 |
7d6b451f |
751 | |
752 | C<use Moose::Exporter;> now imports C<strict> and C<warnings> into packages |
753 | that use it. |
754 | |
def57e8d |
755 | =head1 0.77 |
c3fdacda |
756 | |
757 | C<DEMOLISHALL> and C<DEMOLISH> now receive an argument indicating whether or |
758 | not we are in global destruction. |
759 | |
def57e8d |
760 | =head1 0.76 |
00c61603 |
761 | |
9f0b3b64 |
762 | Type constraints no longer run coercions for a value that already matches the |
763 | constraint. This may affect some (arguably buggy) edge case coercions that |
764 | rely on side effects in the C<via> clause. |
765 | |
def57e8d |
766 | =head1 0.75 |
f869fc4a |
767 | |
768 | L<Moose::Exporter> now accepts the C<-metaclass> option for easily |
769 | overriding the metaclass (without L<metaclass>). This works for classes |
770 | and roles. |
771 | |
def57e8d |
772 | =head1 0.74 |
39ab7714 |
773 | |
85cf0647 |
774 | Added a C<duck_type> sugar function to L<Moose::Util::TypeConstraints> |
775 | to make integration with non-Moose classes easier. It simply checks if |
776 | C<< $obj->can() >> a list of methods. |
39ab7714 |
777 | |
612fd754 |
778 | A number of methods (mostly inherited from L<Class::MOP>) have been |
779 | renamed with a leading underscore to indicate their internal-ness. The |
780 | old method names will still work for a while, but will warn that the |
781 | method has been renamed. In a few cases, the method will be removed |
782 | entirely in the future. This may affect MooseX authors who were using |
783 | these methods. |
784 | |
def57e8d |
785 | =head1 0.73 |
600f7f85 |
786 | |
0f13f53c |
787 | Calling C<subtype> with a name as the only argument now throws an |
600f7f85 |
788 | exception. If you want an anonymous subtype do: |
789 | |
790 | my $subtype = subtype as 'Foo'; |
791 | |
0f13f53c |
792 | This is related to the changes in version 0.71_01. |
600f7f85 |
793 | |
501db4e6 |
794 | The C<is_needed> method in L<Moose::Meta::Method::Destructor> is now |
795 | only usable as a class method. Previously, it worked as a class or |
796 | object method, with a different internal implementation for each |
797 | version. |
798 | |
799 | The internals of making a class immutable changed a lot in Class::MOP |
800 | 0.78_02, and Moose's internals have changed along with it. The |
801 | external C<< $metaclass->make_immutable >> method still works the same |
802 | way. |
803 | |
def57e8d |
804 | =head1 0.72 |
600f7f85 |
805 | |
0f13f53c |
806 | A mutable class accepted C<< Foo->new(undef) >> without complaint, |
807 | while an immutable class would blow up with an unhelpful error. Now, |
808 | in both cases we throw a helpful error instead. |
600f7f85 |
809 | |
0f13f53c |
810 | This "feature" was originally added to allow for cases such as this: |
600f7f85 |
811 | |
812 | my $args; |
0f13f53c |
813 | |
814 | if ( something() ) { |
815 | $args = {...}; |
600f7f85 |
816 | } |
0f13f53c |
817 | |
600f7f85 |
818 | return My::Class->new($args); |
819 | |
0f13f53c |
820 | But we decided this is a bad idea and a little too magical, because it |
821 | can easily mask real errors. |
600f7f85 |
822 | |
def57e8d |
823 | =head1 0.71_01 |
600f7f85 |
824 | |
0f13f53c |
825 | Calling C<type> or C<subtype> without the sugar helpers (C<as>, |
826 | C<where>, C<message>) is now deprecated. |
827 | |
828 | As a side effect, this meant we ended up using Perl prototypes on |
829 | C<as>, and code like this will no longer work: |
600f7f85 |
830 | |
831 | use Moose::Util::TypeConstraints; |
832 | use Declare::Constraints::Simple -All; |
0f13f53c |
833 | |
834 | subtype 'ArrayOfInts' |
600f7f85 |
835 | => as 'ArrayRef' |
836 | => IsArrayRef(IsInt); |
837 | |
838 | Instead it must be changed to this: |
839 | |
0f13f53c |
840 | subtype( |
841 | 'ArrayOfInts' => { |
842 | as => 'ArrayRef', |
843 | where => IsArrayRef(IsInt) |
844 | } |
600f7f85 |
845 | ); |
846 | |
0f13f53c |
847 | If you want to maintain backwards compat with older versions of Moose, |
848 | you must explicitly test Moose's C<VERSION>: |
600f7f85 |
849 | |
0f13f53c |
850 | if ( Moose->VERSION < 0.71_01 ) { |
851 | subtype 'ArrayOfInts' |
600f7f85 |
852 | => as 'ArrayRef' |
853 | => IsArrayRef(IsInt); |
854 | } |
855 | else { |
0f13f53c |
856 | subtype( |
857 | 'ArrayOfInts' => { |
858 | as => 'ArrayRef', |
859 | where => IsArrayRef(IsInt) |
860 | } |
600f7f85 |
861 | ); |
862 | } |
863 | |
def57e8d |
864 | =head1 0.70 |
600f7f85 |
865 | |
0f13f53c |
866 | We no longer pass the meta-attribute object as a final argument to |
867 | triggers. This actually changed for inlined code a while back, but the |
868 | non-inlined version and the docs were still out of date. |
869 | |
870 | If by some chance you actually used this feature, the workaround is |
871 | simple. You fetch the attribute object from out of the C<$self> |
872 | that is passed as the first argument to trigger, like so: |
873 | |
874 | has 'foo' => ( |
875 | is => 'ro', |
876 | isa => 'Any', |
877 | trigger => sub { |
878 | my ( $self, $value ) = @_; |
879 | my $attr = $self->meta->find_attribute_by_name('foo'); |
880 | |
881 | # ... |
882 | } |
883 | ); |
600f7f85 |
884 | |
def57e8d |
885 | =head1 0.66 |
600f7f85 |
886 | |
0f13f53c |
887 | If you created a subtype and passed a parent that Moose didn't know |
888 | about, it simply ignored the parent. Now it automatically creates the |
889 | parent as a class type. This may not be what you want, but is less |
890 | broken than before. |
600f7f85 |
891 | |
0f13f53c |
892 | You could declare a name with subtype such as "Foo!Bar". Moose would |
893 | accept this allowed, but if you used it in a parameterized type such |
894 | as "ArrayRef[Foo!Bar]" it wouldn't work. We now do some vetting on |
895 | names created via the sugar functions, so that they can only contain |
896 | alphanumerics, ":", and ".". |
600f7f85 |
897 | |
def57e8d |
898 | =head1 0.65 |
600f7f85 |
899 | |
900 | Methods created via an attribute can now fulfill a C<requires> |
0f13f53c |
901 | declaration for a role. Honestly we don't know why Stevan didn't make |
902 | this work originally, he was just insane or something. |
600f7f85 |
903 | |
0f13f53c |
904 | Stack traces from inlined code will now report the line and file as |
905 | being in your class, as opposed to in Moose guts. |
600f7f85 |
906 | |
def57e8d |
907 | =head1 0.62_02 |
600f7f85 |
908 | |
0f13f53c |
909 | When a class does not provide all of a role's required methods, the |
910 | error thrown now mentions all of the missing methods, as opposed to |
911 | just the first missing method. |
600f7f85 |
912 | |
0f13f53c |
913 | Moose will no longer inline a constructor for your class unless it |
5e26e3f2 |
914 | inherits its constructor from Moose::Object, and will warn when it |
915 | doesn't inline. If you want to force inlining anyway, pass |
b84f64da |
916 | C<< replace_constructor => 1 >> to C<make_immutable>. |
0f13f53c |
917 | |
918 | If you want to get rid of the warning, pass C<< inline_constructor => |
fbf7ba85 |
919 | 0 >>. |
600f7f85 |
920 | |
def57e8d |
921 | =head1 0.62 |
600f7f85 |
922 | |
0f13f53c |
923 | Removed the (deprecated) C<make_immutable> keyword. |
600f7f85 |
924 | |
925 | Removing an attribute from a class now also removes delegation |
0f13f53c |
926 | (C<handles>) methods installed for that attribute. This is correct |
600f7f85 |
927 | behavior, but if you were wrongly relying on it you might get bit. |
928 | |
def57e8d |
929 | =head1 0.58 |
600f7f85 |
930 | |
0f13f53c |
931 | Roles now add methods by calling C<add_method>, not |
932 | C<alias_method>. They make sure to always provide a method object, |
933 | which will be cloned internally. This means that it is now possible to |
934 | track the source of a method provided by a role, and even follow its |
935 | history through intermediate roles. This means that methods added by |
936 | a role now show up when looking at a class's method list/map. |
937 | |
938 | Parameter and Union args are now sorted, this makes Int|Str the same |
939 | constraint as Str|Int. Also, incoming type constraint strings are |
940 | normalized to remove all whitespace differences. This is mostly for |
941 | internals and should not affect outside code. |
942 | |
943 | L<Moose::Exporter> will no longer remove a subroutine that the |
944 | exporting package re-exports. Moose re-exports the Carp::confess |
945 | function, among others. The reasoning is that we cannot know whether |
946 | you have also explicitly imported those functions for your own use, so |
947 | we err on the safe side and always keep them. |
600f7f85 |
948 | |
def57e8d |
949 | =head1 0.56 |
600f7f85 |
950 | |
0f13f53c |
951 | C<Moose::init_meta> should now be called as a method. |
600f7f85 |
952 | |
0f13f53c |
953 | New modules for extension writers, L<Moose::Exporter> and |
954 | L<Moose::Util::MetaRole>. |
600f7f85 |
955 | |
def57e8d |
956 | =head1 0.55_01 |
600f7f85 |
957 | |
958 | Implemented metaclass traits (and wrote a recipe for it): |
959 | |
960 | use Moose -traits => 'Foo' |
961 | |
962 | This should make writing small Moose extensions a little |
963 | easier. |
964 | |
def57e8d |
965 | =head1 0.55 |
600f7f85 |
966 | |
967 | Fixed C<coerce> to accept anon types just like C<subtype> can. |
968 | So that you can do: |
969 | |
970 | coerce $some_anon_type => from 'Str' => via { ... }; |
971 | |
def57e8d |
972 | =head1 0.51 |
600f7f85 |
973 | |
52da380a |
974 | Added C<BUILDARGS>, a new step in C<< Moose::Object->new() >>. |
600f7f85 |
975 | |
def57e8d |
976 | =head1 0.49 |
600f7f85 |
977 | |
0f13f53c |
978 | Fixed how the C<< is => (ro|rw) >> works with custom defined |
979 | C<reader>, C<writer> and C<accessor> options. See the below table for |
600f7f85 |
980 | details: |
981 | |
982 | is => ro, writer => _foo # turns into (reader => foo, writer => _foo) |
983 | is => rw, writer => _foo # turns into (reader => foo, writer => _foo) |
984 | is => rw, accessor => _foo # turns into (accessor => _foo) |
985 | is => ro, accessor => _foo # error, accesor is rw |
986 | |
def57e8d |
987 | =head1 0.45 |
600f7f85 |
988 | |
0f13f53c |
989 | The C<before/around/after> method modifiers now support regexp |
990 | matching of method names. NOTE: this only works for classes, it is |
991 | currently not supported in roles, but, ... patches welcome. |
600f7f85 |
992 | |
0f13f53c |
993 | The C<has> keyword for roles now accepts the same array ref form that |
994 | L<Moose>.pm does for classes. |
600f7f85 |
995 | |
0f13f53c |
996 | A trigger on a read-only attribute is no longer an error, as it's |
997 | useful to trigger off of the constructor. |
600f7f85 |
998 | |
0f13f53c |
999 | Subtypes of parameterizable types now are parameterizable types |
1000 | themselves. |
600f7f85 |
1001 | |
def57e8d |
1002 | =head1 0.44 |
600f7f85 |
1003 | |
0f13f53c |
1004 | Fixed issue where C<DEMOLISHALL> was eating the value in C<$@>, and so |
1005 | not working correctly. It still kind of eats them, but so does vanilla |
1006 | perl. |
600f7f85 |
1007 | |
def57e8d |
1008 | =head1 0.41 |
600f7f85 |
1009 | |
0f13f53c |
1010 | Inherited attributes may now be extended without restriction on the |
600f7f85 |
1011 | type ('isa', 'does'). |
1012 | |
0f13f53c |
1013 | The entire set of Moose::Meta::TypeConstraint::* classes were |
1014 | refactored in this release. If you were relying on their internals you |
1015 | should test your code carefully. |
600f7f85 |
1016 | |
def57e8d |
1017 | =head1 0.40 |
600f7f85 |
1018 | |
0f13f53c |
1019 | Documenting the use of '+name' with attributes that come from recently |
1020 | composed roles. It makes sense, people are using it, and so why not |
1021 | just officially support it. |
600f7f85 |
1022 | |
0f13f53c |
1023 | The C<< Moose::Meta::Class->create >> method now supports roles. |
600f7f85 |
1024 | |
86b96832 |
1025 | It is now possible to make anonymous enum types by passing C<enum> an |
1026 | array reference instead of the C<< enum $name => @values >>. |
600f7f85 |
1027 | |
def57e8d |
1028 | =head1 0.37 |
600f7f85 |
1029 | |
0f13f53c |
1030 | Added the C<make_immutable> keyword as a shortcut to calling |
1031 | C<make_immutable> on the meta object. This eventually got removed! |
600f7f85 |
1032 | |
0f13f53c |
1033 | Made C<< init_arg => undef >> work in Moose. This means "do not accept |
600f7f85 |
1034 | a constructor parameter for this attribute". |
1035 | |
0f13f53c |
1036 | Type errors now use the provided message. Prior to this release they |
1037 | didn't. |
600f7f85 |
1038 | |
def57e8d |
1039 | =head1 0.34 |
600f7f85 |
1040 | |
1041 | Moose is now a postmodern object system :) |
1042 | |
0f13f53c |
1043 | The Role system was completely refactored. It is 100% backwards |
1044 | compat, but the internals were totally changed. If you relied on the |
1045 | internals then you are advised to test carefully. |
600f7f85 |
1046 | |
1047 | Added method exclusion and aliasing for Roles in this release. |
1048 | |
0f13f53c |
1049 | Added the L<Moose::Util::TypeConstraints::OptimizedConstraints> |
1050 | module. |
600f7f85 |
1051 | |
0f13f53c |
1052 | Passing a list of values to an accessor (which is only expecting one |
1053 | value) used to be silently ignored, now it throws an error. |
600f7f85 |
1054 | |
def57e8d |
1055 | =head1 0.26 |
600f7f85 |
1056 | |
0f13f53c |
1057 | Added parameterized types and did a pretty heavy refactoring of the |
1058 | type constraint system. |
600f7f85 |
1059 | |
7bb4be82 |
1060 | Better framework extensibility and better support for "making your own |
0f13f53c |
1061 | Moose". |
600f7f85 |
1062 | |
def57e8d |
1063 | =head1 0.25 or before |
600f7f85 |
1064 | |
0f13f53c |
1065 | Honestly, you shouldn't be using versions of Moose that are this old, |
1066 | so many bug fixes and speed improvements have been made you would be |
1067 | crazy to not upgrade. |
600f7f85 |
1068 | |
0f13f53c |
1069 | Also, I am tired of going through the Changelog so I am stopping here, |
1070 | if anyone would like to continue this please feel free. |
600f7f85 |
1071 | |
0f13f53c |
1072 | =cut |