X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FAttributeHelpers%2FMethodProvider%2FHash.pm;h=57d3d6a54b73f6c4c184eb3f146542ffa4595d1c;hb=2e74144c8801485e5c33fdcdcbee9f7d882c1a3a;hp=5f2cde3ee3490200947912f944a641aeb4fc53f5;hpb=8cf40f808c137fab5ab7438ade7308fe97d09884;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm index 5f2cde3..57d3d6a 100644 --- a/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm +++ b/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm @@ -1,52 +1,91 @@ package MooseX::AttributeHelpers::MethodProvider::Hash; use Moose::Role; -our $VERSION = '0.01'; +our $VERSION = '0.23'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; -sub exists : method { - my ($attr, $reader, $writer) = @_; - return sub { exists $reader->($_[0])->{$_[1]} ? 1 : 0 }; -} - -sub get : method { - my ($attr, $reader, $writer) = @_; - return sub { $reader->($_[0])->{$_[1]} }; -} +with 'MooseX::AttributeHelpers::MethodProvider::ImmutableHash'; 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"; - $reader->($_[0])->{$_[1]} = $_[2] + my ( $self, @kvp ) = @_; + + my ( @keys, @values ); + + while ( @kvp ) { + my ( $key, $value ) = ( shift(@kvp), shift(@kvp) ); + ($container_type_constraint->check($value)) + || confess "Value " . ($value||'undef') . " did not pass container type constraint '$container_type_constraint'"; + push @keys, $key; + push @values, $value; + } + + if ( @values > 1 ) { + @{ $reader->($self) }{@keys} = @values; + } else { + $reader->($self)->{$keys[0]} = $values[0]; + } }; } else { - return sub { $reader->($_[0])->{$_[1]} = $_[2] }; + return sub { + if ( @_ == 3 ) { + $reader->($_[0])->{$_[1]} = $_[2] + } else { + my ( $self, @kvp ) = @_; + my ( @keys, @values ); + + while ( @kvp ) { + push @keys, shift @kvp; + push @values, shift @kvp; + } + + @{ $reader->($_[0]) }{@keys} = @values; + } + }; } } -sub keys : method { - my ($attr, $reader, $writer) = @_; - return sub { keys %{$reader->($_[0])} }; -} - -sub values : method { +sub accessor : method { my ($attr, $reader, $writer) = @_; - return sub { values %{$reader->($_[0])} }; -} - -sub count : method { - my ($attr, $reader, $writer) = @_; - return sub { scalar keys %{$reader->($_[0])} }; -} -sub empty : method { - my ($attr, $reader, $writer) = @_; - return sub { scalar keys %{$reader->($_[0])} ? 1 : 0 }; + 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 { @@ -56,7 +95,10 @@ sub clear : method { sub delete : method { my ($attr, $reader, $writer) = @_; - return sub { delete $reader->($_[0])->{$_[1]} }; + return sub { + my $hashref = $reader->(shift); + CORE::delete @{$hashref}{@_}; + }; } 1; @@ -74,6 +116,9 @@ MooseX::AttributeHelpers::MethodProvider::Hash This is a role which provides the method generators for L. +This role is composed from the +L role. + =head1 METHODS =over 4 @@ -88,22 +133,53 @@ L. =item B +Returns the number of elements in the hash. + =item B +Removes the element with the given key + +=item B + +Returns true if the value of a given key is defined + =item B +If the list is populated, returns true. Otherwise, returns false. + =item B +Unsets the hash entirely. + =item B +Returns true if the given key is present in the hash + =item B +Returns an element of the hash by its key. + =item B +Returns the list of keys in the hash. + =item B +Sets the element in the hash at the given key to the given value. + =item B +Returns the list of values in the hash. + +=item B + +Returns the key, value pairs in the hash + +=item B + +If passed one argument, returns the value of the requested key. If passed two +arguments, sets the value of the requested key. + =back =head1 BUGS @@ -118,7 +194,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2007 by Infinity Interactive, Inc. +Copyright 2007-2009 by Infinity Interactive, Inc. L