X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FAttributeHelpers%2FMethodProvider%2FHash.pm;h=6d25ed35ddc5facba0dac8afa7581f62b5baa4eb;hb=d071f896e163e4f4d15cc79e08a62d68cdfb05b9;hp=6e084540988a13ee5744607fd6f246e233767bbb;hpb=d1213e927ebf1c78cd7244689f75c236a085abb9;p=gitmo%2FMooseX-AttributeHelpers.git diff --git a/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm b/lib/MooseX/AttributeHelpers/MethodProvider/Hash.pm index 6e08454..6d25ed3 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.17'; +$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])} = () }; @@ -94,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