Class:...ccessor(3pm)

πŸ“¦
version 0.04004 Β· 4 versions
, in debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking

🌸 Class::Data::Accessor β€” okay bestie, sit down, we're doing class data πŸ’…

So this page? It's Class:...ccessor(3pm), part of the User Contributed Perl Documentation collection. Iconic. Slightly deprecated. We'll get to that. πŸ™ˆ


✨ NAME ✨

Class::Data::Accessor β€” inheritable, overridable class and instance data accessor creation. That's the whole vibe. πŸ¦‹


✨ SYNOPSIS ✨

okay so here's how you actually use it, no cap:

package Stuff;
use base qw(Class::Data::Accessor);

# Set up DataFile as inheritable class data.
Stuff->mk_classaccessor('DataFile');

# Declare the location of the data file for this class.
Stuff->DataFile('/etc/stuff/data');

# Or, all in one shot:
Stuff->mk_classaccessor(DataFile => '/etc/stuff/data');

Stuff->DataFile; # returns /etc/stuff/data

my $stuff = Stuff->new; # your new, not ours

$stuff->DataFile; # returns /etc/stuff/data

$stuff->DataFile('/etc/morestuff'); # sets it on the object

Stuff->DataFile; # still returns /etc/stuff/data

See how the object got its own lil value but the class kept the original? That's the whole ✨point✨. Chef's kiss. 😘


✨ DESCRIPTION ✨

This module is now deprecated! 😭 Fr fr. Please consider using Class::Accessor::Grouped or Moose instead. It's giving "we've grown, we've moved on".

Okay so Class::Data::Accessor is literally the marriage of Class::Accessor and Class::Data::Inheritable into one single module. One module. One love. πŸ’– It's for creating accessors to class data that you can override in subclasses and in class instances. Both. Periodt.

For example:

Pere::Ubu->mk_classaccessor('Suitcase');

this will generate the method Suitcase() in the class Pere::Ubu. Boom. Method created. πŸͺ„

This new method can be used to get and set a piece of class data:

Pere::Ubu->Suitcase('Red');
$suitcase = Pere::Ubu->Suitcase;

Taking this one step further (main character energy), you can make a subclass that inherits from Pere::Ubu:

package Raygun;
use base qw(Pere::Ubu);

# Raygun's suitcase is Red.
$suitcase = Raygun->Suitcase;

Raygun inherits its Suitcase class data from Pere::Ubu. As it should. πŸ’…

Inheritance of class data works analogous to method inheritance. As long as Raygun does not "override" its inherited class data (by using Suitcase() to set a new value) it will continue to use whatever is set in Pere::Ubu and inherit further changes:

# Both Raygun's and Pere::Ubu's suitcases are now Blue
Pere::Ubu->Suitcase('Blue');

However, should Raygun decide to set its own Suitcase() it has now "overridden" Pere::Ubu and is on its own, just like if it had overridden a method:

# Raygun has an orange suitcase, Pere::Ubu's is still Blue.
Raygun->Suitcase('Orange');

Now that Raygun has overridden Pere::Ubu, further changes by Pere::Ubu no longer effect Raygun. She's independent now. She moved out. πŸ¦‹

# Raygun still has an orange suitcase, but Pere::Ubu is using Samsonite.
Pere::Ubu->Suitcase('Samsonite');

You can also override this class data on a per-object basis. If $obj isa Pere::Ubu then:

$obj->Suitcase; # will return Samsonite

$obj->Suitcase('Purple'); # will set Suitcase *for this object only*

And after you've done that:

$obj->Suitcase; # will return Purple

but

Pere::Ubu->Suitcase; # will still return Samsonite

The object did its own thing and the class is unbothered. Healthy boundaries. 🌸

If you don't want this behaviour use Class::Data::Inheritable instead.

⚠️ Heads up bestie: "mk_classaccessor" will die if used as an object method instead of as a class method. Class method only. No exceptions. πŸ’€

✨ METHODS ✨

🌈 mk_classaccessor

Class->mk_classaccessor($data_accessor_name);
Class->mk_classaccessor($data_accessor_name => $value);

This is a class method used to declare new class data accessors. A new accessor will be created in the Class using the name from $data_accessor_name, and optionally initially setting it to the given value. Set and forget, or set-and-set. Your call. ✨

To facilitate overriding, mk_classaccessor creates an alias to the accessor, _field_accessor(). So Suitcase() would have an alias _Suitcase_accessor() that does the exact same thing as Suitcase(). This is useful if you want to alter the behavior of a single accessor yet still get the benefits of inheritable class data. For example:

sub Suitcase {
    my($self) = shift;
    warn "Fashion tragedy" if @_ and $_[0] eq 'Plaid';

    $self->_Suitcase_accessor(@_);
}

(not the plaid 😭)

Overriding accessors does not work in the same class as you declare the accessor in. It only works in subclasses due to the fact that subroutines are loaded at compile time and accessors are loaded at runtime, thus overriding any subroutines with the same name in the same class. Timing is everything, iykyk. ⏰

🌈 mk_classaccessors(@accessornames)

Takes a list of names and generates an accessor for each name in the list using "mk_classaccessor". Bulk mode. Efficiency queen. πŸ‘‘


✨ AUTHORS ✨

Based on the creative stylings of Damian Conway, Michael G Schwern, Tony Bowden (Class::Data::Inheritable) and Michael G Schwern, Marty Pauley (Class::Accessor).

Coded by Matt S Trout. Tweaks by Christopher H. Laco.

The legends. The blueprint. 🫢


✨ BUGS and QUERIES ✨

If your object isn't hash-based, this will currently break. My modifications aren't exactly sophisticated so far. 🀷 (respect the honesty ngl)

mstrout@cpan.org or bug me on irc.perl.org, nick mst. claco@cpan.org or irc.perl.org, nick claco.

Come say hi, we're friendly. πŸ’œ


✨ LICENSE ✨

This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself. (see http://dev.perl.org/licenses/artistic.html and http://www.opensource.org/licenses/gpl-license.php)

Free as in go wild bestie, just keep the same terms. πŸŽ€


✨ SEE ALSO ✨

  • perltootc has a very elaborate discussion of class data in Perl. (elaborate. she's thorough. πŸ“š)
  • Class::Accessor, Class::Data::Inheritable

okay that's the whole page, you're basically a class-data expert now, slay πŸ’– this was perl v5.36.0, dated 2022-11-19, filed under Class:...ccessor(3pm) β€” mwah, go write some accessors bestie πŸ¦‹βœ¨

πŸ“¦ where this page comes from