The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;

use Test::More tests => 16;

use Class::Ref;

my $error_test = qr/not a valid reference for Class::Ref/;

# for LVALUE test
my $str = 'foo';

# for FORMAT test
format =
.

my %tests = (
    SCALAR  => \1,
    CODE    => sub { },
    REF     => \\1,
    GLOB    => \*_,
    LVALUE  => \substr($str, 0, 1),
    FORMAT  => *STDOUT{FORMAT},       # >= 5.8.9
    Regexp  => qr//,                  # >= 5.8.9
    VSTRING => \v1.0,                 # >= 5.10.0
##  IO => *STDIN{IO}, # not really testable (>= 5.8.9)
);

while (my ($type, $ref) = each %tests) {
    eval { Class::Ref->new($ref) };
    like $@, $error_test, "reject $type";
}

my $obj = Class::Ref->new({});

while (my ($type, $ref) = each %tests) {
    SKIP: {
        skip "$type not available in perl < 5.8.9", 1
          if $type =~ /^(FORMAT|IO|Regexp)$/ and $] < 5.008009;

        skip "$type not available in perl < 5.10.0", 1
          if $type eq 'VSTRING' and $] < 5.010000;

        $obj->holder($ref);
        is ref $obj->holder, $type, " passthru $type";
    }
}