The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More 'no_plan';

use strict;
use warnings;

my $REG = {};

{
    package A;
    use Coat;

    has id => (
        is        => 'rw',
        predicate => 'has_id',
        clearer   => 'clear_id',
    );
}

can_ok(A => 'has_id', 'clear_id');
my $a = A->new;
ok(!$a->has_id, "no ID yet");
$a->clear_id;
ok(!$a->has_id, "clearer didn't set ID");

$a->id(1);
is($a->id, 1, "value is set");
ok($a->has_id, "setting the value did set the ID");
$a->clear_id;
is($a->id, undef, "no value after clearer");
ok(!$a->has_id, "running the clearer makes predicate return false");

$a->id(1);
ok($a->has_id, "we have a value again..");

$a->id(undef);
ok($a->has_id, "setting to undef means we still have a value");

$a->clear_id;
ok(!$a->has_id, "clearing from undef still makes predicate false");
is($a->id, undef, "value is still undef");