autoboxing
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox / Array.pm
index 1b31e90..a33c1b5 100644 (file)
@@ -1,12 +1,50 @@
 package Moose::Autobox::Array;
 use Moose::Role 'with';
+use autobox;
 
 our $VERSION = '0.01';
 
 with 'Moose::Autobox::Ref',
      'Moose::Autobox::List';
+    
+## Array Interface
+
+sub pop { 
+    my ($array) = @_;    
+    CORE::pop @$array; 
+}
+
+sub push { 
+    my ($array, @rest) = @_;
+    CORE::push @$array, @rest;  
+    $array; 
+}
+
+sub unshift { 
+    my ($array, @rest) = @_;    
+    CORE::unshift @$array, @rest; 
+    $array; 
+}
+
+sub delete { 
+    my ($array, $index) = @_;    
+    CORE::delete $array->[$index];
+}
+
+sub shift { 
+    my ($array) = @_;    
+    CORE::shift @$array; 
+}     
+
+# NOTE: 
+# sprintf args need to be reversed, 
+# because the invocant is the array
+sub sprintf { CORE::sprintf $_[1], @{$_[0]} }
 
-## List interface
+## ::List interface implementation
+
+sub head { $_[0]->[0] }
+sub tail { [ @{$_[0]}[ 1 .. $#{$_[0]} ] ] }
  
 sub length {
     my ($array) = @_;
@@ -24,7 +62,8 @@ sub map {
 }
 
 sub join { 
-    my ($array, $sep) = @_;     
+    my ($array, $sep) = @_;    
+    $sep ||= ''; 
     CORE::join $sep, @$array; 
 }
 
@@ -37,43 +76,19 @@ sub sort {
     my ($array, $sub) = @_;     
     $sub ||= sub { $a cmp $b }; 
     [ CORE::sort { $sub->($a, $b) } @$array ]; 
-}     
+}    
 
-## Array Interface
+# ::Value requirement
 
-sub pop { 
-    my ($array) = @_;    
-    CORE::pop @$array; 
-}
+sub print { CORE::print @{$_[0]} }
 
-sub push { 
-    my ($array, @rest) = @_;
-    CORE::push @$array, @rest;  
-    $array; 
-}
+## ::Indexed implementation
 
-sub unshift { 
-    my ($array, @rest) = @_;    
-    CORE::unshift @$array, @rest; 
-    $array; 
-}
 sub exists {
     my ($array, $index) = @_;    
     CORE::exists $array->[$index];    
 }
 
-sub delete { 
-    my ($array, $index) = @_;    
-    CORE::delete $array->[$index];
-}
-
-sub shift { 
-    my ($array) = @_;    
-    CORE::shift @$array; 
-}
-
-## 
-
 sub keys { 
     my ($array) = @_;    
     [ 0 .. $#{$array} ];
@@ -86,7 +101,7 @@ sub values {
 
 sub kv {
     my ($array) = @_;   
-    [ CORE::map { [ $_, $array->[$_] ] } $array->keys ];
+    $array->keys->map(sub { [ $_, $array->[$_] ] });
 }
 
 1;