NAME
   Attribute::Protected - implementing proctected methods with attributes

SYNOPSIS
     package SomeClass;
     use Attribute::Protected;

     sub foo  :Public    { }
     sub _bar :Private   { }
     sub _baz :Protected { }

     sub another {
         my $self = shift;
         $self->foo;               # OK
         $self->_bar;              # OK
         $self->_baz;              # OK
     }

     package DerivedClass;
     @DerivedClass::ISA = qw(SomeClass);

     sub yetanother {
         my $self = shift;
         $self->foo;               # OK
         $self->_bar;              # NG: private method
         $self->_baz;              # OK
     }

     package main;

     my $some = SomeClass->new;
     $some->foo;           # OK
     $some->_bar;          # NG: private method
     $some->_baz;          # NG: protected method

DESCRIPTION
   Attribute::Protected implements something like public / private /
   protected methods in C++ or Java.

ATTRIBUTES
   Public
         sub foo :Public { }

       just a mark. Can be called from everywhere.

   Private
         sub _bar :Private { }

       Can't be called from outside the class where it was declared.

   Protected
         sub _baz :Protected { }

       Can be called from the class where it was declared or its derived
       classes.

   When called from inappropriate classes, those methods throw an exception
   like "foo() is a protected method of Foo!".

AUTHOR
   Tatsuhiko Miyagawa, <[email protected]>

SEE ALSO
   the Attribute::Handlers manpage, the Protect manpage, the Class::Fields
   manpage