Perl6-AttrX::PrivateAccessor
NAME
AttrX::PrivateAccessor
SYNOPSIS
Provide private accessor for private attribute, provide only read accessor, see NOTES for the reason
DESCRIPTION
This module provides trait private-accessible (providing-private-accessor was too long), which will create a private accessor for a private attribute, in read only, no modification possible
It allows from within a class to access another instance of the same class' private attributes
use AttrX::PrivateAccessor;
class Sample
has $!attribute is private-accessible;
}
is equivalent to
class Sample
has $!attribute;
method !attribute() {
return $!attribute;
}
}
The private accessor method by default will have the name of the attribute, but can be customized, as an argument to the trait
use AttrX::PrivateAccessor;
class Sample
has $!attribute is private-accessible('accessor');
}
THe private method will then be
method !accessor() { $!attribute }
A use case for having private read accessor could be, let's see that we have class who store a chareacteristic under an interanl format, that should not be visible from the outside. To check if two instances of that class are equal, we have to compare that internal value, we would have a method like that
class Foo {
has $!characteristic is private-accessible;
...
method equal( Foo:D: Foo:D $other ) {
return $!characteristic == $other!characteristic;
}
}
Without the trai, we can't know the value in the other instance
NOTES
This module create private accessor in read-only mode. Even if really useful sometimes, accessing private attributes of another instance of the same class is starting to violate encapsulation. Giving permission to modify private attributes of another instance seemed a bit to much, if it is really needed, i guess it would really be some specific case, where writing a dedicated private method with comments seems more adequate. However, if one day that behavior has to be implemented, it could be done through a parameter of the trait, like
has $!attribute is private-accessible( :rw )
MISC
To test the meta data of the modules, set environement variable PERL6_TEST_META to 1