X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FAttributeHelpers%2FMethodProvider%2FArray.pm;h=13cd2f375bf94bcf1060140d49b23ece41dd4ff2;hb=fda444e70db8fa4a13c1a24dda315b506d45b839;hp=2dd8f1dc552d6e0d63a4be55082802cc20eb3184;hpb=c91a1347ecaec6bb5db5ea89b69ac9ea1c3014ad;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Array.pm index 2dd8f1d..13cd2f3 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.02'; +our $VERSION = '0.20'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; with 'MooseX::AttributeHelpers::MethodProvider::List'; @@ -9,12 +10,12 @@ with 'MooseX::AttributeHelpers::MethodProvider::List'; sub push : method { my ($attr, $reader, $writer) = @_; - if ($attr->has_container_type) { - my $container_type_constraint = $attr->container_type_constraint; + 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 $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)} => @_; }; @@ -36,12 +37,12 @@ sub pop : method { sub unshift : method { my ($attr, $reader, $writer) = @_; - if ($attr->has_container_type) { - my $container_type_constraint = $attr->container_type_constraint; + 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 $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)} => @_; }; @@ -70,11 +71,11 @@ sub get : method { sub set : method { my ($attr, $reader, $writer) = @_; - if ($attr->has_container_type) { - my $container_type_constraint = $attr->container_type_constraint; + if ($attr->has_type_constraint && $attr->type_constraint->isa('Moose::Meta::TypeConstraint::Parameterized')) { + 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] }; } @@ -84,7 +85,115 @@ 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 { + @{$reader->($_[0])} = () + }; +} + +sub delete : method { + my ($attr, $reader, $writer) = @_; + return sub { + CORE::splice @{$reader->($_[0])}, $_[1], 1; + } +} + +sub insert : 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 { + ($container_type_constraint->check($_[2])) + || confess "Value " . ($_[2]||'undef') . " did not pass container type constraint '$container_type_constraint'"; + CORE::splice @{$reader->($_[0])}, $_[1], 0, $_[2]; + }; + } + else { + return sub { + CORE::splice @{$reader->($_[0])}, $_[1], 0, $_[2]; + }; + } +} + +sub splice : 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, $i, $j, @elems ) = @_; + ($container_type_constraint->check($_)) + || 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 @{$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__ @@ -94,7 +203,7 @@ __END__ =head1 NAME MooseX::AttributeHelpers::MethodProvider::Array - + =head1 DESCRIPTION This is a role which provides the method generators for @@ -127,6 +236,27 @@ see those provied methods, refer to that documentation. =item B +=item B + +=item B + +=item B + +=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 @@ -141,7 +271,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2007 by Infinity Interactive, Inc. +Copyright 2007-2009 by Infinity Interactive, Inc. L