You are viewing the version of this documentation from Perl 5.34.1. View the latest version

CONTENTS

NAME

Test2::Util::HashBase - Build hash based classes.

SYNOPSIS

A class:

package My::Class;
use strict;
use warnings;

# Generate 3 accessors
use Test2::Util::HashBase qw/foo -bar ^baz <bat >ban +boo/;

# Chance to initialize defaults
sub init {
    my $self = shift;    # No other args
    $self->{+FOO} ||= "foo";
    $self->{+BAR} ||= "bar";
    $self->{+BAZ} ||= "baz";
    $self->{+BAT} ||= "bat";
    $self->{+BAN} ||= "ban";
    $self->{+BOO} ||= "boo";
}

sub print {
    print join ", " => map { $self->{$_} } FOO, BAR, BAZ, BAT, BAN, BOO;
}

Subclass it

package My::Subclass;
use strict;
use warnings;

# Note, you should subclass before loading HashBase.
use base 'My::Class';
use Test2::Util::HashBase qw/bub/;

sub init {
    my $self = shift;

    # We get the constants from the base class for free.
    $self->{+FOO} ||= 'SubFoo';
    $self->{+BUB} ||= 'bub';

    $self->SUPER::init();
}

use it:

package main;
use strict;
use warnings;
use My::Class;

# These are all functionally identical
my $one   = My::Class->new(foo => 'MyFoo', bar => 'MyBar');
my $two   = My::Class->new({foo => 'MyFoo', bar => 'MyBar'});
my $three = My::Class->new(['MyFoo', 'MyBar']);

# Readers!
my $foo = $one->foo;    # 'MyFoo'
my $bar = $one->bar;    # 'MyBar'
my $baz = $one->baz;    # Defaulted to: 'baz'
my $bat = $one->bat;    # Defaulted to: 'bat'
# '>ban' means setter only, no reader
# '+boo' means no setter or reader, just the BOO constant

# Setters!
$one->set_foo('A Foo');

#'-bar' means read-only, so the setter will throw an exception (but is defined).
$one->set_bar('A bar');

# '^baz' means deprecated setter, this will warn about the setter being
# deprecated.
$one->set_baz('A Baz');

# '<bat' means no setter defined at all
# '+boo' means no setter or reader, just the BOO constant

$one->{+FOO} = 'xxx';

DESCRIPTION

This package is used to generate classes based on hashrefs. Using this class will give you a new() method, as well as generating accessors you request. Generated accessors will be getters, set_ACCESSOR setters will also be generated for you. You also get constants for each accessor (all caps) which return the key into the hash for that accessor. Single inheritance is also supported.