use strict;
use Test::More tests => 8;
BEGIN { use_ok('Attribute::Protected') }
package SomeClass;
sub foo :Private { }
sub bar :Protected { }
sub baz :Public { }
sub call_foo {
my $self = shift;
$self->foo;
}
sub call_bar {
my $self = shift;
$self->bar;
}
package DerivedClass;
@DerivedClass::ISA = qw(SomeClass);
sub call_foo_direct {
my $self = shift;
$self->foo;
}
sub call_bar_direct {
my $self = shift;
$self->bar;
}
package main;
my $some = bless {}, 'SomeClass';
# NG: private
eval { $some->foo };
like($@, qr/private/, 'call private from outside');
# NG: protected
eval { $some->bar };
like($@, qr/protected/, 'call protected from outside');
# OK: public
eval { $some->baz };
is($@, '', 'call public');
# OK: private
eval { $some->call_foo };
is($@, '', 'call private from inside');
# OK: protected
eval { $some->call_bar };
is($@, '', 'call protected from inside');
my $derived = bless {}, 'DerivedClass';
# NG: private
eval { $derived->call_foo_direct };
like($@, qr/private/, 'call private from derived');
# OK: protected
eval { $derived->call_bar_direct };
is($@, '', 'call protected from derived');