All unit tests passing with refactored stuff, documentation updated significantly.
[gitmo/MooseX-AttributeHelpers.git] / lib / MooseX / AttributeHelpers / MethodProvider / Hash.pm
index f70c5ef..2ab57a4 100644 (file)
@@ -1,24 +1,30 @@
 package MooseX::AttributeHelpers::MethodProvider::Hash;
 use Moose::Role;
+use MooseX::AttributeHelpers::Collection::TypeCheck;
 
-our $VERSION   = '0.03';
+our $VERSION   = '0.04';
 our $AUTHORITY = 'cpan:STEVAN';
 
 with 'MooseX::AttributeHelpers::MethodProvider::ImmutableHash';
 
 sub set : 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";                        
-            $reader->($_[0])->{$_[1]} = $_[2] 
-        };
-    }
-    else {
-        return sub { $reader->($_[0])->{$_[1]} = $_[2] };
-    }
+    type_check(
+        $attr, 
+        sub {
+            my ($self, %pairs) = @_;
+            return (values %pairs);
+        },
+        sub {
+            my ($self, @pairs) = @_;
+            my $hash = $reader->($self);
+            while (@pairs) {
+                my $key = shift(@pairs);
+                my $value = shift(@pairs);
+                $hash->{$key} = $value;
+            }
+        },
+    );
 }
 
 sub clear : method {
@@ -28,7 +34,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;
@@ -44,18 +53,9 @@ MooseX::AttributeHelpers::MethodProvider::Hash
 =head1 DESCRIPTION
 
 This is a role which provides the method generators for 
-L<MooseX::AttributeHelpers::Collection::Hash>.
-
-This role is composed from the 
-L<MooseX::AttributeHelpers::Collection::ImmutableHash> role.
-
-=head1 METHODS
-
-=over 4
-
-=item B<meta>
-
-=back
+L<MooseX::AttributeHelpers::Collection::Hash>.  It consumes 
+L<MooseX::AttributeHelpers::MethodProvider::ImmutableHash>, and thus 
+provides all its methods as wel.
 
 =head1 PROVIDED METHODS
 
@@ -63,23 +63,20 @@ L<MooseX::AttributeHelpers::Collection::ImmutableHash> role.
 
 =item B<count>
 
-=item B<delete>
-
-=item B<empty>
+Returns the number of items in the hash.
 
-=item B<clear>
+=item B<delete(@keys)>
 
-=item B<exists>
+Deletes the specified keys from the hash.
 
-=item B<get>
+=item B<clear>
 
-=item B<keys>
+Deletes all keys from the hash.
 
 =item B<set>
 
-=item B<values>
-
-=item B<kv>
+Sets the specified keys to the specified values.  You can specify several of
+these at once, in key => value order.
 
 =back
 
@@ -95,7 +92,7 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2007 by Infinity Interactive, Inc.
+Copyright 2007-2008 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>