X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FAttributeHelpers%2FMethodProvider%2FArray.pm;h=3fead0c2dbd3432c9d66d63d4137738cb5877d70;hb=9e2db1c2f1fac57b7908a080ba8c552e4ae2b59c;hp=3ea71b4ff109739820900922455425ea783b6b0c;hpb=331e1af071868ee1c56f59091da141822c7542b0;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm index 3ea71b4..3fead0c 100644 --- a/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm +++ b/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm @@ -1,7 +1,8 @@ package MooseX::AttributeHelpers::MethodProvider::Array; use Moose::Role; -our $VERSION = '0.05'; +our $VERSION = '0.17'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; with 'MooseX::AttributeHelpers::MethodProvider::List'; @@ -124,17 +125,37 @@ sub splice : method { my ( $self, $i, $j, @elems ) = @_; ($container_type_constraint->check($_)) || confess "Value " . (defined($_) ? $_ : 'undef') . " did not pass container type constraint" for @elems; - CORE::splice @{$self->$reader()}, $i, $j, @elems; + CORE::splice @{$reader->($self)}, $i, $j, @elems; }; } else { return sub { my ( $self, $i, $j, @elems ) = @_; - CORE::splice @{$self->$reader()}, $i, $j, @elems; + CORE::splice @{$reader->($self)}, $i, $j, @elems; }; } } +sub sort_in_place : method { + my ($attr, $reader, $writer) = @_; + return sub { + my ($instance, $predicate) = @_; + + die "Argument must be a code reference" + if $predicate && ref $predicate ne 'CODE'; + + my @sorted; + if ($predicate) { + @sorted = CORE::sort { $predicate->($a, $b) } @{$reader->($instance)}; + } + else { + @sorted = CORE::sort @{$reader->($instance)}; + } + + $writer->($instance, \@sorted); + }; +} + 1; __END__ @@ -144,7 +165,7 @@ __END__ =head1 NAME MooseX::AttributeHelpers::MethodProvider::Array - + =head1 DESCRIPTION This is a role which provides the method generators for @@ -185,6 +206,14 @@ see those provied methods, refer to that documentation. =item B +=item B + +Sorts the array I, modifying the value of the attribute. + +You can provide an optional subroutine reference to sort with (as you +can with the core C function). However, instead of using C<$a> +and C<$b>, you will need to use C<$_[0]> and C<$_[1]> instead. + =back =head1 BUGS