Version 1.05
[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
e462f6f3 19=head1 1.05
20
a19ae3d7 21=over 4
22
23=item L<Moose::Object/BUILD> methods are now called when calling C<new_object>
24
25Previously, C<BUILD> methods would only be called from C<Moose::Object::new>,
26but now they are also called when constructing an object via
27C<Moose::Meta::Class::new_object>. C<BUILD> methods are an inherent part of the
28object construction process, and this should make C<< $meta->new_object >>
29actually usable without forcing people to use C<< $meta->name->new >>.
30
2fee26f1 31=item C<no Moose>, C<no Moose::Role>, and C<no Moose::Exporter> now unimport strict and warnings
32
33In the interest of having C<no Moose> clean up everything that C<use Moose>
34does in the calling scope, C<no Moose> (as well as all other
35L<Moose::Exporter>-using modules) now unimports strict and warnings.
36
f46a74bf 37=item Metaclass compatibility checking and fixing should be much more robust
38
39The L<metaclass compatibility|Moose/METACLASS COMPATIBILITY AND MOOSE> checking
40and fixing algorithms have been completely rewritten, in both Class::MOP and
41Moose. This should resolve many confusing errors when dealing with non-Moose
42inheritance and with custom metaclasses for things like attributes,
43constructors, etc.
44
a19ae3d7 45=back
46
8ff79890 47=head1 1.02
48
49=over 4
50
51=item Moose::Meta::TypeConstraint::Class is_subtype_of behavior
52
53Earlier versions of L<is_subtype_of|Moose::Meta::TypeConstraint::Class/is_subtype_of>
54would incorrectly return true when called with itself, its own TC name or
55its class name as an argument. (i.e. $foo_tc->is_subtype_of('Foo') == 1) This
56behavior was a caused by C<isa> being checked before the class name. The old
57behavior can be accessed with L<is_type_of|Moose::Meta::TypeConstraint::Class/is_type_of>
58
59=back
60
12885414 61=head1 1.00
62
63=over 4
64
65=item Moose::Meta::Attribute::Native::Trait::Code no longer creates reader methods by default
66
67Earlier versions of L<Moose::Meta::Attribute::Native::Trait::Code> created
68read-only accessors for the attributes it's been applied to, even if you didn't
69ask for it with C<< is => 'ro' >>. This incorrect behaviour has now been fixed.
70
71=back
72
775666aa 73=head1 0.95
74
75=over 4
76
77=item Moose::Util add_method_modifier behavior
78
79add_method_modifier (and subsequently the sugar functions Moose::before,
80Moose::after, and Moose::around) can now accept arrayrefs, with the same
81behavior as lists. Types other than arrayref and regexp result in an error.
82
83=back
84
5b7b27e2 85=head1 0.93_01 and 0.94
86
87=over 4
88
f785aad8 89=item Moose::Util::MetaRole API has changed
90
91The C<apply_metaclass_roles> function is now called C<apply_metaroles>. The
92way arguments are supplied has been changed to force you to distinguish
93between metaroles applied to L<Moose::Meta::Class> (and helpers) versus
94L<Moose::Meta::Role>.
95
96The old API still works, but will warn in a future release, and eventually be
97removed.
98
99=item Moose::Meta::Role has real attributes
100
101The attributes returned by L<Moose::Meta::Role> are now instances of the
102L<Moose::Meta::Role::Attribute> class, instead of bare hash references.
103
5b7b27e2 104=item "no Moose" now removes C<blessed> and C<confess>
105
106Moose is now smart enough to know exactly what it exported, even when it
107re-exports functions from other packages. When you unimport Moose, it will
108remove these functions from your namespace unless you I<also> imported them
109directly from their respective packages.
110
111If you have a C<no Moose> in your code I<before> you call C<blessed> or
112C<confess>, your code will break. You can either move the C<no Moose> call
113later in your code, or explicitly import the relevant functions from the
114packages that provide them.
115
116=item L<Moose::Exporter> is smarter about unimporting re-exports
117
118The change above comes from a general improvement to L<Moose::Exporter>. It
119will now unimport any function it exports, even if that function is a
120re-export from another package.
121
f427b505 122=item Attributes in roles can no longer override class attributes with "+foo"
123
124Previously, this worked more or less accidentally, because role attributes
125weren't objects. This was never documented, but a few MooseX modules took
126advantage of this.
127
128=item The composition_class_roles attribute in L<Moose::Meta::Role> is now a method
129
130This was done to make it possible for roles to alter the the list of
131composition class roles by applying a method modifiers. Previously, this was
132an attribute and MooseX modules override it. Since that no longer works, this
133was made a method.
134
135This I<should> be an attribute, so this may switch back to being an attribute
136in the future if we can figure out how to make this work.
137
5b7b27e2 138=back
139
c378a61a 140=head1 0.93
141
142=over 4
143
144=item Calling $object->new() is no longer deprecated
145
76c89056 146We decided to undeprecate this. Now it just works.
c378a61a 147
d99ec58b 148=item Both C<get_method_map> and C<get_attribute_map> is deprecated
fa6da135 149
d99ec58b 150These metaclass methods were never meant to be public, and they are both now
151deprecated. The work around if you still need the functionality they provided
152is to iterate over the list of names manually.
fa6da135 153
154 my %fields = map { $_ => $meta->get_attribute($_) } $meta->get_attribute_list;
155
d99ec58b 156This was actually a change in L<Class::MOP>, but this version of Moose
157requires a version of L<Class::MOP> that includes said change.
158
c378a61a 159=back
160
b98ef150 161=head1 0.90
871f82f8 162
c985327a 163=over 4
164
93ef4ba1 165=item Added Native delegation for Code refs
166
167See L<Moose::Meta::Attribute::Native::Trait::Code> for details.
168
3f5ff7d0 169=item Calling $object->new() is deprecated
170
171Moose has long supported this, but it's never really been documented, and we
172don't think this is a good practice. If you want to construct an object from
173an existing object, you should provide some sort of alternate constructor like
174C<< $object->clone >>.
175
176Calling C<< $object->new >> now issues a warning, and will be an error in a
177future release.
178
19e60fdd 179=item Moose no longer warns if you call C<make_immutable> for a class with mutable ancestors
180
181While in theory this is a good thing to warn about, we found so many
182exceptions to this that doing this properly became quite problematic.
183
93ef4ba1 184=back
185
186=head1 Version 0.89_02
187
188=over 4
4f0d4488 189
871f82f8 190=item New Native delegation methods from L<List::Util> and L<List::MoreUtils>
191
192In particular, we now have C<reduce>, C<shuffle>, C<uniq>, and C<natatime>.
193
3023f1e4 194=item The Moose::Exporter with_caller feature is now deprecated
195
196Use C<with_meta> instead. The C<with_caller> option will start warning in a
197future release.
198
9b9a5a07 199=item Moose now warns if you call C<make_immutable> for a class with mutable ancestors
200
201This is dangerous because modifying a class after a subclass has been
90b20bd6 202immutabilized will lead to incorrect results in the subclass, due to inlining,
9b9a5a07 203caching, etc. This occasionally happens accidentally, when a class loads one
204of its subclasses in the middle of its class definition, so pointing out that
205this may cause issues should be helpful. Metaclasses (classes that inherit
206from L<Class::MOP::Object>) are currently exempt from this check, since at the
90b20bd6 207moment we aren't very consistent about which metaclasses we immutabilize.
9b9a5a07 208
bce5d4a5 209=item C<enum> and C<duck_type> now take arrayrefs for all forms
210
211Previously, calling these functions with a list would take the first element of
212the list as the type constraint name, and use the remainder as the enum values
213or method names. This makes the interface inconsistent with the anon-type forms
214of these functions (which must take an arrayref), and a free-form list where
215the first value is sometimes special is hard to validate (and harder to give
216reasonable error messages for). These functions have been changed to take
217arrayrefs in all their forms - so, C<< enum 'My::Type' => [qw(foo bar)] >> is
218now the preferred way to create an enum type constraint. The old syntax still
219works for now, but it will hopefully be deprecated and removed in a future
220release.
221
871f82f8 222=back
223
4ada9618 224=head1 Version 0.89_01
a3d98218 225
af44c00c 226L<Moose::Meta::Attribute::Native> has been moved into the Moose core from
a3d98218 227L<MooseX::AttributeHelpers>. Major changes include:
228
ebaaa391 229=over 4
a3d98218 230
231=item C<traits>, not C<metaclass>
232
93ced2bd 233Method providers are only available via traits.
a3d98218 234
235=item C<handles>, not C<provides> or C<curries>
236
93ced2bd 237The C<provides> syntax was like core Moose C<< handles => HASHREF >>
238syntax, but with the keys and values reversed. This was confusing,
239and AttributeHelpers now uses C<< handles => HASHREF >> in a way that
240should be intuitive to anyone already familiar with how it is used for
241other attributes.
a3d98218 242
93ced2bd 243The C<curries> functionality provided by AttributeHelpers has been
244generalized to apply to all cases of C<< handles => HASHREF >>, though
245not every piece of functionality has been ported (currying with a
246CODEREF is not supported).
a3d98218 247
1853a27e 248=item C<empty> is now C<is_empty>, and means empty, not non-empty
af44c00c 249
250Previously, the C<empty> method provided by Arrays and Hashes returned true if
251the attribute was B<not> empty (no elements). Now it returns true if the
1853a27e 252attribute B<is> empty. It was also renamed to C<is_empty>, to reflect this.
af44c00c 253
9a14bd29 254=item C<find> was renamed to C<first>, and C<first> and C<last> were removed
28b96142 255
256L<List::Util> refers to the functionality that we used to provide under C<find>
257as L<first|List::Util/first>, so that will likely be more familiar (and will
9a14bd29 258fit in better if we decide to add more List::Util functions). C<first> and
259C<last> were removed, since their functionality is easily duplicated with
260curries of C<get>.
28b96142 261
262=item Helpers that take a coderef of one argument now use C<$_>
263
264Subroutines passed as the first argument to C<first>, C<map>, and C<grep> now
265receive their argument in C<$_> rather than as a parameter to the subroutine.
266Helpers that take a coderef of two or more arguments remain using the argument
267list (there are technical limitations to using C<$a> and C<$b> like C<sort>
268does).
269
af44c00c 270See L<Moose::Meta::Attribute::Native> for the new documentation.
a3d98218 271
ebaaa391 272=back
273
85e2b15a 274The C<alias> and C<excludes> role parameters have been renamed to C<-alias>
275and C<-excludes>. The old names still work, but new code should use the new
276names, and eventually the old ones will be deprecated and removed.
277
4ada9618 278=head1 Version 0.89
279
8a8856de 280C<< use Moose -metaclass => 'Foo' >> now does alias resolution, just like
281C<-traits> (and the C<metaclass> and C<traits> options to C<has>).
282
27f2f43f 283Added two functions C<meta_class_alias> and C<meta_attribute_alias> to
284L<Moose::Util>, to simplify aliasing metaclasses and metatraits. This is
285a wrapper around the old
286
287 package Moose::Meta::Class::Custom::Trait::FooTrait;
288 sub register_implementation { 'My::Meta::Trait' }
289
290way of doing this.
291
4831e2de 292=head1 Version 0.84
293
9f52cce5 294When an attribute generates I<no> accessors, we now warn. This is to help
295users who forget the C<is> option. If you really do not want any accessors,
3de02fd8 296you can use C<< is => 'bare' >>. You can maintain back compat with older
297versions of Moose by using something like:
298
299 ($Moose::VERSION >= 0.84 ? is => 'bare' : ())
9f52cce5 300
301When an accessor overwrites an existing method, we now warn. To work around
302this warning (if you really must have this behavior), you can explicitly
303remove the method before creating it as an accessor:
304
305 sub foo {}
306
307 __PACKAGE__->meta->remove_method('foo');
308
309 has foo => (
310 is => 'ro',
311 );
312
313When an unknown option is passed to C<has>, we now warn. You can silence
314the warning by fixing your code. :)
315
4831e2de 316The C<Role> type has been deprecated. On its own, it was useless,
317since it just checked C<< $object->can('does') >>. If you were using
318it as a parent type, just call C<role_type('Role::Name')> to create an
319appropriate type instead.
320
7d6b451f 321=head1 Version 0.78
322
323C<use Moose::Exporter;> now imports C<strict> and C<warnings> into packages
324that use it.
325
c3fdacda 326=head1 Version 0.77
327
328C<DEMOLISHALL> and C<DEMOLISH> now receive an argument indicating whether or
329not we are in global destruction.
330
00c61603 331=head1 Version 0.76
332
9f0b3b64 333Type constraints no longer run coercions for a value that already matches the
334constraint. This may affect some (arguably buggy) edge case coercions that
335rely on side effects in the C<via> clause.
336
f869fc4a 337=head1 Version 0.75
338
339L<Moose::Exporter> now accepts the C<-metaclass> option for easily
340overriding the metaclass (without L<metaclass>). This works for classes
341and roles.
342
39ab7714 343=head1 Version 0.74
344
85cf0647 345Added a C<duck_type> sugar function to L<Moose::Util::TypeConstraints>
346to make integration with non-Moose classes easier. It simply checks if
347C<< $obj->can() >> a list of methods.
39ab7714 348
612fd754 349A number of methods (mostly inherited from L<Class::MOP>) have been
350renamed with a leading underscore to indicate their internal-ness. The
351old method names will still work for a while, but will warn that the
352method has been renamed. In a few cases, the method will be removed
353entirely in the future. This may affect MooseX authors who were using
354these methods.
355
600f7f85 356=head1 Version 0.73
357
0f13f53c 358Calling C<subtype> with a name as the only argument now throws an
600f7f85 359exception. If you want an anonymous subtype do:
360
361 my $subtype = subtype as 'Foo';
362
0f13f53c 363This is related to the changes in version 0.71_01.
600f7f85 364
501db4e6 365The C<is_needed> method in L<Moose::Meta::Method::Destructor> is now
366only usable as a class method. Previously, it worked as a class or
367object method, with a different internal implementation for each
368version.
369
370The internals of making a class immutable changed a lot in Class::MOP
3710.78_02, and Moose's internals have changed along with it. The
372external C<< $metaclass->make_immutable >> method still works the same
373way.
374
600f7f85 375=head1 Version 0.72
376
0f13f53c 377A mutable class accepted C<< Foo->new(undef) >> without complaint,
378while an immutable class would blow up with an unhelpful error. Now,
379in both cases we throw a helpful error instead.
600f7f85 380
0f13f53c 381This "feature" was originally added to allow for cases such as this:
600f7f85 382
383 my $args;
0f13f53c 384
385 if ( something() ) {
386 $args = {...};
600f7f85 387 }
0f13f53c 388
600f7f85 389 return My::Class->new($args);
390
0f13f53c 391But we decided this is a bad idea and a little too magical, because it
392can easily mask real errors.
600f7f85 393
394=head1 Version 0.71_01
395
0f13f53c 396Calling C<type> or C<subtype> without the sugar helpers (C<as>,
397C<where>, C<message>) is now deprecated.
398
399As a side effect, this meant we ended up using Perl prototypes on
400C<as>, and code like this will no longer work:
600f7f85 401
402 use Moose::Util::TypeConstraints;
403 use Declare::Constraints::Simple -All;
0f13f53c 404
405 subtype 'ArrayOfInts'
600f7f85 406 => as 'ArrayRef'
407 => IsArrayRef(IsInt);
408
409Instead it must be changed to this:
410
0f13f53c 411 subtype(
412 'ArrayOfInts' => {
413 as => 'ArrayRef',
414 where => IsArrayRef(IsInt)
415 }
600f7f85 416 );
417
0f13f53c 418If you want to maintain backwards compat with older versions of Moose,
419you must explicitly test Moose's C<VERSION>:
600f7f85 420
0f13f53c 421 if ( Moose->VERSION < 0.71_01 ) {
422 subtype 'ArrayOfInts'
600f7f85 423 => as 'ArrayRef'
424 => IsArrayRef(IsInt);
425 }
426 else {
0f13f53c 427 subtype(
428 'ArrayOfInts' => {
429 as => 'ArrayRef',
430 where => IsArrayRef(IsInt)
431 }
600f7f85 432 );
433 }
434
435=head1 Version 0.70
436
0f13f53c 437We no longer pass the meta-attribute object as a final argument to
438triggers. This actually changed for inlined code a while back, but the
439non-inlined version and the docs were still out of date.
440
441If by some chance you actually used this feature, the workaround is
442simple. You fetch the attribute object from out of the C<$self>
443that is passed as the first argument to trigger, like so:
444
445 has 'foo' => (
446 is => 'ro',
447 isa => 'Any',
448 trigger => sub {
449 my ( $self, $value ) = @_;
450 my $attr = $self->meta->find_attribute_by_name('foo');
451
452 # ...
453 }
454 );
600f7f85 455
456=head1 Version 0.66
457
0f13f53c 458If you created a subtype and passed a parent that Moose didn't know
459about, it simply ignored the parent. Now it automatically creates the
460parent as a class type. This may not be what you want, but is less
461broken than before.
600f7f85 462
0f13f53c 463You could declare a name with subtype such as "Foo!Bar". Moose would
464accept this allowed, but if you used it in a parameterized type such
465as "ArrayRef[Foo!Bar]" it wouldn't work. We now do some vetting on
466names created via the sugar functions, so that they can only contain
467alphanumerics, ":", and ".".
600f7f85 468
469=head1 Version 0.65
470
471Methods created via an attribute can now fulfill a C<requires>
0f13f53c 472declaration for a role. Honestly we don't know why Stevan didn't make
473this work originally, he was just insane or something.
600f7f85 474
0f13f53c 475Stack traces from inlined code will now report the line and file as
476being in your class, as opposed to in Moose guts.
600f7f85 477
478=head1 Version 0.62_02
479
0f13f53c 480When a class does not provide all of a role's required methods, the
481error thrown now mentions all of the missing methods, as opposed to
482just the first missing method.
600f7f85 483
0f13f53c 484Moose will no longer inline a constructor for your class unless it
5e26e3f2 485inherits its constructor from Moose::Object, and will warn when it
486doesn't inline. If you want to force inlining anyway, pass
b84f64da 487C<< replace_constructor => 1 >> to C<make_immutable>.
0f13f53c 488
489If you want to get rid of the warning, pass C<< inline_constructor =>
fbf7ba85 4900 >>.
600f7f85 491
492=head1 Version 0.62
493
0f13f53c 494Removed the (deprecated) C<make_immutable> keyword.
600f7f85 495
496Removing an attribute from a class now also removes delegation
0f13f53c 497(C<handles>) methods installed for that attribute. This is correct
600f7f85 498behavior, but if you were wrongly relying on it you might get bit.
499
500=head1 Version 0.58
501
0f13f53c 502Roles now add methods by calling C<add_method>, not
503C<alias_method>. They make sure to always provide a method object,
504which will be cloned internally. This means that it is now possible to
505track the source of a method provided by a role, and even follow its
506history through intermediate roles. This means that methods added by
507a role now show up when looking at a class's method list/map.
508
509Parameter and Union args are now sorted, this makes Int|Str the same
510constraint as Str|Int. Also, incoming type constraint strings are
511normalized to remove all whitespace differences. This is mostly for
512internals and should not affect outside code.
513
514L<Moose::Exporter> will no longer remove a subroutine that the
515exporting package re-exports. Moose re-exports the Carp::confess
516function, among others. The reasoning is that we cannot know whether
517you have also explicitly imported those functions for your own use, so
518we err on the safe side and always keep them.
600f7f85 519
520=head1 Version 0.56
521
0f13f53c 522C<Moose::init_meta> should now be called as a method.
600f7f85 523
0f13f53c 524New modules for extension writers, L<Moose::Exporter> and
525L<Moose::Util::MetaRole>.
600f7f85 526
527=head1 Version 0.55_01
528
529Implemented metaclass traits (and wrote a recipe for it):
530
531 use Moose -traits => 'Foo'
532
533This should make writing small Moose extensions a little
534easier.
535
536=head1 Version 0.55
537
538Fixed C<coerce> to accept anon types just like C<subtype> can.
539So that you can do:
540
541 coerce $some_anon_type => from 'Str' => via { ... };
542
543=head1 Version 0.51
544
52da380a 545Added C<BUILDARGS>, a new step in C<< Moose::Object->new() >>.
600f7f85 546
547=head1 Version 0.49
548
0f13f53c 549Fixed how the C<< is => (ro|rw) >> works with custom defined
550C<reader>, C<writer> and C<accessor> options. See the below table for
600f7f85 551details:
552
553 is => ro, writer => _foo # turns into (reader => foo, writer => _foo)
554 is => rw, writer => _foo # turns into (reader => foo, writer => _foo)
555 is => rw, accessor => _foo # turns into (accessor => _foo)
556 is => ro, accessor => _foo # error, accesor is rw
557
558=head1 Version 0.45
559
0f13f53c 560The C<before/around/after> method modifiers now support regexp
561matching of method names. NOTE: this only works for classes, it is
562currently not supported in roles, but, ... patches welcome.
600f7f85 563
0f13f53c 564The C<has> keyword for roles now accepts the same array ref form that
565L<Moose>.pm does for classes.
600f7f85 566
0f13f53c 567A trigger on a read-only attribute is no longer an error, as it's
568useful to trigger off of the constructor.
600f7f85 569
0f13f53c 570Subtypes of parameterizable types now are parameterizable types
571themselves.
600f7f85 572
573=head1 Version 0.44
574
0f13f53c 575Fixed issue where C<DEMOLISHALL> was eating the value in C<$@>, and so
576not working correctly. It still kind of eats them, but so does vanilla
577perl.
600f7f85 578
579=head1 Version 0.41
580
0f13f53c 581Inherited attributes may now be extended without restriction on the
600f7f85 582type ('isa', 'does').
583
0f13f53c 584The entire set of Moose::Meta::TypeConstraint::* classes were
585refactored in this release. If you were relying on their internals you
586should test your code carefully.
600f7f85 587
588=head1 Version 0.40
589
0f13f53c 590Documenting the use of '+name' with attributes that come from recently
591composed roles. It makes sense, people are using it, and so why not
592just officially support it.
600f7f85 593
0f13f53c 594The C<< Moose::Meta::Class->create >> method now supports roles.
600f7f85 595
86b96832 596It is now possible to make anonymous enum types by passing C<enum> an
597array reference instead of the C<< enum $name => @values >>.
600f7f85 598
599=head1 Version 0.37
600
0f13f53c 601Added the C<make_immutable> keyword as a shortcut to calling
602C<make_immutable> on the meta object. This eventually got removed!
600f7f85 603
0f13f53c 604Made C<< init_arg => undef >> work in Moose. This means "do not accept
600f7f85 605a constructor parameter for this attribute".
606
0f13f53c 607Type errors now use the provided message. Prior to this release they
608didn't.
600f7f85 609
610=head1 Version 0.34
611
612Moose is now a postmodern object system :)
613
0f13f53c 614The Role system was completely refactored. It is 100% backwards
615compat, but the internals were totally changed. If you relied on the
616internals then you are advised to test carefully.
600f7f85 617
618Added method exclusion and aliasing for Roles in this release.
619
0f13f53c 620Added the L<Moose::Util::TypeConstraints::OptimizedConstraints>
621module.
600f7f85 622
0f13f53c 623Passing a list of values to an accessor (which is only expecting one
624value) used to be silently ignored, now it throws an error.
600f7f85 625
626=head1 Version 0.26
627
0f13f53c 628Added parameterized types and did a pretty heavy refactoring of the
629type constraint system.
600f7f85 630
0f13f53c 631Better framework extendability and better support for "making your own
632Moose".
600f7f85 633
634=head1 Version 0.25 or before
635
0f13f53c 636Honestly, you shouldn't be using versions of Moose that are this old,
637so many bug fixes and speed improvements have been made you would be
638crazy to not upgrade.
600f7f85 639
0f13f53c 640Also, I am tired of going through the Changelog so I am stopping here,
641if anyone would like to continue this please feel free.
600f7f85 642
643=head1 AUTHOR
644
645Stevan Little E<lt>stevan@iinteractive.comE<gt>
646
647=head1 COPYRIGHT AND LICENSE
648
649Copyright 2009 by Infinity Interactive, Inc.
650
651L<http://www.iinteractive.com>
652
653This library is free software; you can redistribute it and/or modify
654it under the same terms as Perl itself.
655
0f13f53c 656=cut