fixed _refkind for \$object, \\$object. Added tests for _refkind
Laurent Dami [Wed, 12 Nov 2008 05:25:34 +0000 (05:25 +0000)]
MANIFEST
lib/SQL/Abstract.pm
t/09refkind.t [new file with mode: 0644]

index 5ca4d1a..039267f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -11,4 +11,6 @@ t/03values.t
 t/06order_by.t\r
 t/07subqueries.t\r
 t/08special_ops.t\r
+t/09refkind.t\r
+\r
 \r
index 8034548..b3c4581 100644 (file)
@@ -871,23 +871,23 @@ sub _refkind {
   my ($self, $data) = @_;
   my $suffix = '';
   my $ref;
+  my $n_steps = 0;
 
-  # $suffix = 'REF' x (length of ref chain, i. e. \\[] is REFREFREF)
   while (1) {
-    # blessed references are considered like scalars
-    last if blessed $data;
-    $suffix .= 'REF';
-    $ref     = ref $data;
-
-    last if $ref ne 'REF';
+    # blessed objects are treated like scalars
+    $ref = (blessed $data) ? '' : ref $data;
+    $n_steps += 1 if $ref;
+    last          if $ref ne 'REF';
     $data = $$data;
   }
 
-  return $ref          ? $ref.$suffix   :
-         defined $data ? 'SCALAR'       :
-                         'UNDEF';
+  my $base = $ref || (defined $data ? 'SCALAR' : 'UNDEF');
+
+  return $base . ('REF' x $n_steps);
 }
 
+
+
 sub _try_refkind {
   my ($self, $data) = @_;
   my @try = ($self->_refkind($data));
diff --git a/t/09refkind.t b/t/09refkind.t
new file mode 100644 (file)
index 0000000..e51fcf0
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/perl\r
+\r
+use strict;\r
+use warnings;\r
+use Test::More;\r
+use SQL::Abstract;\r
+\r
+plan tests => 13;\r
+\r
+my $obj = bless {}, "Foo::Bar";\r
+\r
+is(SQL::Abstract->_refkind(undef), 'UNDEF', 'UNDEF');\r
+\r
+is(SQL::Abstract->_refkind({}), 'HASHREF', 'HASHREF');\r
+is(SQL::Abstract->_refkind([]), 'ARRAYREF', 'ARRAYREF');\r
+\r
+is(SQL::Abstract->_refkind(\{}), 'HASHREFREF', 'HASHREFREF');\r
+is(SQL::Abstract->_refkind(\[]), 'ARRAYREFREF', 'ARRAYREFREF');\r
+\r
+is(SQL::Abstract->_refkind(\\{}), 'HASHREFREFREF', 'HASHREFREFREF');\r
+is(SQL::Abstract->_refkind(\\[]), 'ARRAYREFREFREF', 'ARRAYREFREFREF');\r
+\r
+is(SQL::Abstract->_refkind("foo"), 'SCALAR', 'SCALAR');\r
+is(SQL::Abstract->_refkind(\"foo"), 'SCALARREF', 'SCALARREF');\r
+is(SQL::Abstract->_refkind(\\"foo"), 'SCALARREFREF', 'SCALARREFREF');\r
+\r
+# objects are treated like scalars\r
+is(SQL::Abstract->_refkind($obj), 'SCALAR', 'SCALAR');\r
+is(SQL::Abstract->_refkind(\$obj), 'SCALARREF', 'SCALARREF');\r
+is(SQL::Abstract->_refkind(\\$obj), 'SCALARREFREF', 'SCALARREFREF');\r
+\r