The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
BEGIN { chdir 't' if -d 't' };

use strict;
use lib '../lib';
use Test::More 'no_plan';
use Data::Dumper;

my $Class = 'Object::Accessor';

use_ok($Class);

my $Object  = $Class->new;
my $Acc     = 'foo';
my $Alias   = 'bar';

ok( $Object,                "Object created" );
isa_ok( $Object, $Class,    "   Object" );

### add an accessor
{   my $rv = $Object->mk_accessors( $Acc );
    ok( $rv,                "Created accessor '$Acc'" );
    ok( $Object->$Acc( $$ ),"   Set value" );
    is( $Object->$Acc, $$,  "   Retrieved value" );
}

### add an alias
{   my $rv = $Object->mk_aliases( $Alias => $Acc );
    ok( $rv,                "Created alias '$Alias'" );
    ok( $Object->can( $Alias ),
                            "   Alias '$Alias' exists" );
    is( $Object->$Alias, $Object->$Acc,
                            "   Alias & original return the same value" );

    ok( $Object->$Alias( $$.$$ ),
                            "   Changed value using alias" );
    is( $Object->$Alias, $Object->$Acc,
                            "   Alias & original return the same value" );
}

### test if cloning works
{   my $clone = $Object->mk_clone;
    ok( $clone,             "Cloned object" );

    is_deeply( [sort $clone->ls_accessors], [sort $Object->ls_accessors],
                            "   All accessors cloned" );

    ok( $clone->$Acc( $$ ), "   Set value" );
    is( $clone->$Alias, $clone->$Acc,
                            "   Alias & original return the same value" );

    ok( $clone->$Alias( $$.$$ ),
                            "   Changed value using alias" );
    is( $clone->$Alias, $clone->$Acc,
                            "   Alias & original return the same value" );
}