optimize the where logic a bit
[gitmo/Moose.git] / lib / Moose / Manual / Delta.pod
CommitLineData
600f7f85 1=pod
2
3=head1 NAME
4
5Moose::Manual::Delta - Important Changes in Moose
6
7=head1 DESCRIPTION
8
0f13f53c 9This documents any important or noteworthy changes in Moose, with a
10focus on backwards. This does duplicate data from the F<Changes> file,
11but aims to provide more details and when possible workarounds.
12
13Besides helping keep up with changes, you can also use this document
14for finding the lowest version of Moose that supported a given
15feature. If you encounter a problem and have a solution but don't see
16it documented here, or think we missed an important feature, please
17send us a patch.
600f7f85 18
39ab7714 19=head1 Version 0.74
20
21Added a C<duck_type> keyword to L<Moose::Util::TypeConstraints> to make
22integration with non-Moose classes easier. It simply checks if $obj->can()
23a list of methods.
24
600f7f85 25=head1 Version 0.73
26
0f13f53c 27Calling C<subtype> with a name as the only argument now throws an
600f7f85 28exception. If you want an anonymous subtype do:
29
30 my $subtype = subtype as 'Foo';
31
0f13f53c 32This is related to the changes in version 0.71_01.
600f7f85 33
501db4e6 34The C<is_needed> method in L<Moose::Meta::Method::Destructor> is now
35only usable as a class method. Previously, it worked as a class or
36object method, with a different internal implementation for each
37version.
38
39The internals of making a class immutable changed a lot in Class::MOP
400.78_02, and Moose's internals have changed along with it. The
41external C<< $metaclass->make_immutable >> method still works the same
42way.
43
600f7f85 44=head1 Version 0.72
45
0f13f53c 46A mutable class accepted C<< Foo->new(undef) >> without complaint,
47while an immutable class would blow up with an unhelpful error. Now,
48in both cases we throw a helpful error instead.
600f7f85 49
0f13f53c 50This "feature" was originally added to allow for cases such as this:
600f7f85 51
52 my $args;
0f13f53c 53
54 if ( something() ) {
55 $args = {...};
600f7f85 56 }
0f13f53c 57
600f7f85 58 return My::Class->new($args);
59
0f13f53c 60But we decided this is a bad idea and a little too magical, because it
61can easily mask real errors.
600f7f85 62
63=head1 Version 0.71_01
64
0f13f53c 65Calling C<type> or C<subtype> without the sugar helpers (C<as>,
66C<where>, C<message>) is now deprecated.
67
68As a side effect, this meant we ended up using Perl prototypes on
69C<as>, and code like this will no longer work:
600f7f85 70
71 use Moose::Util::TypeConstraints;
72 use Declare::Constraints::Simple -All;
0f13f53c 73
74 subtype 'ArrayOfInts'
600f7f85 75 => as 'ArrayRef'
76 => IsArrayRef(IsInt);
77
78Instead it must be changed to this:
79
0f13f53c 80 subtype(
81 'ArrayOfInts' => {
82 as => 'ArrayRef',
83 where => IsArrayRef(IsInt)
84 }
600f7f85 85 );
86
0f13f53c 87If you want to maintain backwards compat with older versions of Moose,
88you must explicitly test Moose's C<VERSION>:
600f7f85 89
0f13f53c 90 if ( Moose->VERSION < 0.71_01 ) {
91 subtype 'ArrayOfInts'
600f7f85 92 => as 'ArrayRef'
93 => IsArrayRef(IsInt);
94 }
95 else {
0f13f53c 96 subtype(
97 'ArrayOfInts' => {
98 as => 'ArrayRef',
99 where => IsArrayRef(IsInt)
100 }
600f7f85 101 );
102 }
103
104=head1 Version 0.70
105
0f13f53c 106We no longer pass the meta-attribute object as a final argument to
107triggers. This actually changed for inlined code a while back, but the
108non-inlined version and the docs were still out of date.
109
110If by some chance you actually used this feature, the workaround is
111simple. You fetch the attribute object from out of the C<$self>
112that is passed as the first argument to trigger, like so:
113
114 has 'foo' => (
115 is => 'ro',
116 isa => 'Any',
117 trigger => sub {
118 my ( $self, $value ) = @_;
119 my $attr = $self->meta->find_attribute_by_name('foo');
120
121 # ...
122 }
123 );
600f7f85 124
125=head1 Version 0.66
126
0f13f53c 127If you created a subtype and passed a parent that Moose didn't know
128about, it simply ignored the parent. Now it automatically creates the
129parent as a class type. This may not be what you want, but is less
130broken than before.
600f7f85 131
0f13f53c 132You could declare a name with subtype such as "Foo!Bar". Moose would
133accept this allowed, but if you used it in a parameterized type such
134as "ArrayRef[Foo!Bar]" it wouldn't work. We now do some vetting on
135names created via the sugar functions, so that they can only contain
136alphanumerics, ":", and ".".
600f7f85 137
138=head1 Version 0.65
139
140Methods created via an attribute can now fulfill a C<requires>
0f13f53c 141declaration for a role. Honestly we don't know why Stevan didn't make
142this work originally, he was just insane or something.
600f7f85 143
0f13f53c 144Stack traces from inlined code will now report the line and file as
145being in your class, as opposed to in Moose guts.
600f7f85 146
147=head1 Version 0.62_02
148
0f13f53c 149When a class does not provide all of a role's required methods, the
150error thrown now mentions all of the missing methods, as opposed to
151just the first missing method.
600f7f85 152
0f13f53c 153Moose will no longer inline a constructor for your class unless it
154inherits its constructor is inherited from Moose::Object, and will
155warn when it doesn't inline. If you want to force inlining anyway,
156pass C<< "replace_constructor => 1 >> to C<make_immutable>.
157
158If you want to get rid of the warning, pass C<< inline_constructor =>
1591 >>.
600f7f85 160
161=head1 Version 0.62
162
0f13f53c 163Removed the (deprecated) C<make_immutable> keyword.
600f7f85 164
165Removing an attribute from a class now also removes delegation
0f13f53c 166(C<handles>) methods installed for that attribute. This is correct
600f7f85 167behavior, but if you were wrongly relying on it you might get bit.
168
169=head1 Version 0.58
170
0f13f53c 171Roles now add methods by calling C<add_method>, not
172C<alias_method>. They make sure to always provide a method object,
173which will be cloned internally. This means that it is now possible to
174track the source of a method provided by a role, and even follow its
175history through intermediate roles. This means that methods added by
176a role now show up when looking at a class's method list/map.
177
178Parameter and Union args are now sorted, this makes Int|Str the same
179constraint as Str|Int. Also, incoming type constraint strings are
180normalized to remove all whitespace differences. This is mostly for
181internals and should not affect outside code.
182
183L<Moose::Exporter> will no longer remove a subroutine that the
184exporting package re-exports. Moose re-exports the Carp::confess
185function, among others. The reasoning is that we cannot know whether
186you have also explicitly imported those functions for your own use, so
187we err on the safe side and always keep them.
600f7f85 188
189=head1 Version 0.56
190
0f13f53c 191C<Moose::init_meta> should now be called as a method.
600f7f85 192
0f13f53c 193New modules for extension writers, L<Moose::Exporter> and
194L<Moose::Util::MetaRole>.
600f7f85 195
196=head1 Version 0.55_01
197
198Implemented metaclass traits (and wrote a recipe for it):
199
200 use Moose -traits => 'Foo'
201
202This should make writing small Moose extensions a little
203easier.
204
205=head1 Version 0.55
206
207Fixed C<coerce> to accept anon types just like C<subtype> can.
208So that you can do:
209
210 coerce $some_anon_type => from 'Str' => via { ... };
211
212=head1 Version 0.51
213
52da380a 214Added C<BUILDARGS>, a new step in C<< Moose::Object->new() >>.
600f7f85 215
216=head1 Version 0.49
217
0f13f53c 218Fixed how the C<< is => (ro|rw) >> works with custom defined
219C<reader>, C<writer> and C<accessor> options. See the below table for
600f7f85 220details:
221
222 is => ro, writer => _foo # turns into (reader => foo, writer => _foo)
223 is => rw, writer => _foo # turns into (reader => foo, writer => _foo)
224 is => rw, accessor => _foo # turns into (accessor => _foo)
225 is => ro, accessor => _foo # error, accesor is rw
226
227=head1 Version 0.45
228
0f13f53c 229The C<before/around/after> method modifiers now support regexp
230matching of method names. NOTE: this only works for classes, it is
231currently not supported in roles, but, ... patches welcome.
600f7f85 232
0f13f53c 233The C<has> keyword for roles now accepts the same array ref form that
234L<Moose>.pm does for classes.
600f7f85 235
0f13f53c 236A trigger on a read-only attribute is no longer an error, as it's
237useful to trigger off of the constructor.
600f7f85 238
0f13f53c 239Subtypes of parameterizable types now are parameterizable types
240themselves.
600f7f85 241
242=head1 Version 0.44
243
0f13f53c 244Fixed issue where C<DEMOLISHALL> was eating the value in C<$@>, and so
245not working correctly. It still kind of eats them, but so does vanilla
246perl.
600f7f85 247
248=head1 Version 0.41
249
0f13f53c 250Inherited attributes may now be extended without restriction on the
600f7f85 251type ('isa', 'does').
252
0f13f53c 253The entire set of Moose::Meta::TypeConstraint::* classes were
254refactored in this release. If you were relying on their internals you
255should test your code carefully.
600f7f85 256
257=head1 Version 0.40
258
0f13f53c 259Documenting the use of '+name' with attributes that come from recently
260composed roles. It makes sense, people are using it, and so why not
261just officially support it.
600f7f85 262
0f13f53c 263The C<< Moose::Meta::Class->create >> method now supports roles.
600f7f85 264
86b96832 265It is now possible to make anonymous enum types by passing C<enum> an
266array reference instead of the C<< enum $name => @values >>.
600f7f85 267
268=head1 Version 0.37
269
0f13f53c 270Added the C<make_immutable> keyword as a shortcut to calling
271C<make_immutable> on the meta object. This eventually got removed!
600f7f85 272
0f13f53c 273Made C<< init_arg => undef >> work in Moose. This means "do not accept
600f7f85 274a constructor parameter for this attribute".
275
0f13f53c 276Type errors now use the provided message. Prior to this release they
277didn't.
600f7f85 278
279=head1 Version 0.34
280
281Moose is now a postmodern object system :)
282
0f13f53c 283The Role system was completely refactored. It is 100% backwards
284compat, but the internals were totally changed. If you relied on the
285internals then you are advised to test carefully.
600f7f85 286
287Added method exclusion and aliasing for Roles in this release.
288
0f13f53c 289Added the L<Moose::Util::TypeConstraints::OptimizedConstraints>
290module.
600f7f85 291
0f13f53c 292Passing a list of values to an accessor (which is only expecting one
293value) used to be silently ignored, now it throws an error.
600f7f85 294
295=head1 Version 0.26
296
0f13f53c 297Added parameterized types and did a pretty heavy refactoring of the
298type constraint system.
600f7f85 299
0f13f53c 300Better framework extendability and better support for "making your own
301Moose".
600f7f85 302
303=head1 Version 0.25 or before
304
0f13f53c 305Honestly, you shouldn't be using versions of Moose that are this old,
306so many bug fixes and speed improvements have been made you would be
307crazy to not upgrade.
600f7f85 308
0f13f53c 309Also, I am tired of going through the Changelog so I am stopping here,
310if anyone would like to continue this please feel free.
600f7f85 311
312=head1 AUTHOR
313
314Stevan Little E<lt>stevan@iinteractive.comE<gt>
315
316=head1 COPYRIGHT AND LICENSE
317
318Copyright 2009 by Infinity Interactive, Inc.
319
320L<http://www.iinteractive.com>
321
322This library is free software; you can redistribute it and/or modify
323it under the same terms as Perl itself.
324
0f13f53c 325=cut