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, <miyagawa@bulknews.net>

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