I have a couple braches sitting around, and it would be great to get
them reviewed and (possibly) merged. They are:
topic/deprecate_alias_excludes
- This builds off the previous topic/rename_alias_excludes, but actually
adds a warning when using the old names.
topic/immutable_subclass_warning
- This deals with an issue we ran into in #moose today - someone had
classes like this:
package Parent;
use Moose;
use Child;
has child => (
is => 'ro',
isa => 'Maybe[Child]',
);
__PACKAGE__->meta->make_immutable;
and
Package Child;
use Moose;
extends 'Parent';
has parent => (
is => 'ro',
isa => 'Parent',
);
__PACKAGE__->meta->make_immutable;
This failed because Child was being created and immutablized partway
through the definition of Parent, and so Child's constructor (among
other things) was incorrect (it didn't include attribute
initialization code for the child attribute). This branch adds a
warning whenever someone tries to call make_immutable on a class whose
ancestor classes are not already immutable. There are a few caveats:
- It ignores Moose::Object, since that's never going to be immutable
(should it be?)
- It ignores metaclasses (by ignoring anything with
$self->isa('Class::MOP::Object')), since metaclasses created by role
composition aren't immutablized, but the metaclass for a class is
immutablized whenever the class is (should this be changed?)
- It ignores anything that doesn't have a metaclass, or whose
metaclass isn't a Moose::Meta::Class, since immutablizing non-Moose
classes doesn't really make sense. This fails if someone has
explicitly done Moose::Meta::Class->initialize($class) previously,
but I don't really see a way around that.
I think that overall, the warning is a good thing though.
topic/strict_export_list
- I was looking through the code the other day and noticed that
Moose::Role had "as_is => [...'make_immutable']", which was apparently
copied directly from Moose.pm back when make_immutable was a keyword,
but when it stopped being a keyword, nobody noticed it still sitting
in Moose::Role (since that was a mistake to begin with). The reason
nobody noticed this is that Moose::Exporter currently doesn't care if
a sub exists or not before trying to export it - since the subs it
exports are wrapped, it'll export the wrapper as the given name, which
will then die when it tries to call the original sub (but only when
the wrapper is actually called). This branch skips exporting
non-existent subs, with a warning.
And, a couple branches off of the attribute_helpers branch:
topic/list_util_helpers
- Adds shuffle, reduce, uniq, and natatime from List::Util and
List::MoreUtils as helpers for Native::Array. These are probably the
most useful ones (and most of the other useful ones can be implemented
in terms of these, with currying), but if there are more that would be
useful, they could certainly be added too.
topic/sort_a_b
- The coderef for the sort attribute helpers are currently passed in the
two arguments as $_[0] and $_[1]. There was some desire expressed for
being able to use $a and $b instead, but there's an issue in that $a
and $b are package scoped, and only using them once in a given package
will give the 'Name "main::a" used only once: possible typo' warning.
This can be silenced by doing "our ($a, $b)" beforehand, and this is
exactly how List::Util::reduce works, but it's still annoying. Another
option would be to pass both and allow either $a and $b or $_[0] and
$_[1] to be used, but then it would be odd to not allow $_[0] and $_
to be used interchangably in subrefs that only take one argument, and
confound pointed out some cases where it would be useful to allow
those to be assigned to different things. This patch is the one I'm
least sure about, I mainly just wanted to see what other people's
opinions were about it.
Thanks,
-doy