X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FAttributeHelpers%2FMethodProvider%2FArray.pm;h=2c4e27bbee6891cf4ac59f6c7c0af24a496889dd;hb=2e74144c8801485e5c33fdcdcbee9f7d882c1a3a;hp=65ea999dbd02e8e6c5c403d45ce65a26a5efaf61;hpb=18d43c2c0d8aca2fd61b44cfc0a041788616895f;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm index 65ea999..2c4e27b 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.13'; +our $VERSION = '0.23'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; with 'MooseX::AttributeHelpers::MethodProvider::List'; @@ -14,7 +15,7 @@ sub push : method { return sub { my $instance = CORE::shift; $container_type_constraint->check($_) - || confess "Value " . ($_||'undef') . " did not pass container type constraint" + || confess "Value " . ($_||'undef') . " did not pass container type constraint '$container_type_constraint'" foreach @_; CORE::push @{$reader->($instance)} => @_; }; @@ -41,7 +42,7 @@ sub unshift : method { return sub { my $instance = CORE::shift; $container_type_constraint->check($_) - || confess "Value " . ($_||'undef') . " did not pass container type constraint" + || confess "Value " . ($_||'undef') . " did not pass container type constraint '$container_type_constraint'" foreach @_; CORE::unshift @{$reader->($instance)} => @_; }; @@ -74,7 +75,7 @@ sub set : method { my $container_type_constraint = $attr->type_constraint->type_parameter; return sub { ($container_type_constraint->check($_[2])) - || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint"; + || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint '$container_type_constraint'"; $reader->($_[0])->[$_[1]] = $_[2] }; } @@ -85,6 +86,44 @@ sub set : method { } } +sub accessor : method { + my ($attr, $reader, $writer) = @_; + + if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) { + my $container_type_constraint = $attr->type_constraint->type_parameter; + return sub { + my $self = shift; + + if (@_ == 1) { # reader + return $reader->($self)->[$_[0]]; + } + elsif (@_ == 2) { # writer + ($container_type_constraint->check($_[1])) + || confess "Value " . ($_[1]||'undef') . " did not pass container type constraint '$container_type_constraint'"; + $reader->($self)->[$_[0]] = $_[1]; + } + else { + confess "One or two arguments expected, not " . @_; + } + }; + } + else { + return sub { + my $self = shift; + + if (@_ == 1) { # reader + return $reader->($self)->[$_[0]]; + } + elsif (@_ == 2) { # writer + $reader->($self)->[$_[0]] = $_[1]; + } + else { + confess "One or two arguments expected, not " . @_; + } + }; + } +} + sub clear : method { my ($attr, $reader, $writer) = @_; return sub { @@ -105,7 +144,7 @@ sub insert : method { my $container_type_constraint = $attr->type_constraint->type_parameter; return sub { ($container_type_constraint->check($_[2])) - || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint"; + || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint '$container_type_constraint'"; CORE::splice @{$reader->($_[0])}, $_[1], 0, $_[2]; }; } @@ -123,18 +162,38 @@ sub splice : method { return sub { 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; + || confess "Value " . (defined($_) ? $_ : 'undef') . " did not pass container type constraint '$container_type_constraint'" for @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 +203,7 @@ __END__ =head1 NAME MooseX::AttributeHelpers::MethodProvider::Array - + =head1 DESCRIPTION This is a role which provides the method generators for @@ -185,6 +244,19 @@ 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. + +=item B + +If passed one argument, returns the value of the requested element. +If passed two arguments, sets the value of the requested element. + =back =head1 BUGS @@ -199,7 +271,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2007-2008 by Infinity Interactive, Inc. +Copyright 2007-2009 by Infinity Interactive, Inc. L