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=a5fbcac785057dd21e8f1a6f48ec45545bdc2ffe;hpb=532b802c617b500ba113122fdcc2bdd4fb58c672;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm index a5fbcac..57d3d6a 100644 --- a/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm +++ b/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm @@ -1,7 +1,8 @@ package MooseX::AttributeHelpers::MethodProvider::Hash; use Moose::Role; -our $VERSION = '0.04'; +our $VERSION = '0.23'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; with 'MooseX::AttributeHelpers::MethodProvider::ImmutableHash'; @@ -18,7 +19,7 @@ sub set : method { while ( @kvp ) { my ( $key, $value ) = ( shift(@kvp), shift(@kvp) ); ($container_type_constraint->check($value)) - || confess "Value " . ($value||'undef') . " did not pass container type constraint"; + || confess "Value " . ($value||'undef') . " did not pass container type constraint '$container_type_constraint'"; push @keys, $key; push @values, $value; } @@ -49,6 +50,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 { %{$reader->($_[0])} = () }; @@ -56,7 +95,10 @@ sub clear : method { sub delete : method { my ($attr, $reader, $writer) = @_; - return sub { CORE::delete $reader->($_[0])->{$_[1]} }; + return sub { + my $hashref = $reader->(shift); + CORE::delete @{$hashref}{@_}; + }; } 1; @@ -91,24 +133,53 @@ L role. =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 @@ -123,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