xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
15759b3d2Safresh1package Test2::Util::ExternalMeta;
25759b3d2Safresh1use strict;
35759b3d2Safresh1use warnings;
45759b3d2Safresh1
5*5486feefSafresh1our $VERSION = '1.302199';
65759b3d2Safresh1
75759b3d2Safresh1
85759b3d2Safresh1use Carp qw/croak/;
95759b3d2Safresh1
105759b3d2Safresh1sub META_KEY() { '_meta' }
115759b3d2Safresh1
125759b3d2Safresh1our @EXPORT = qw/meta set_meta get_meta delete_meta/;
135759b3d2Safresh1BEGIN { require Exporter; our @ISA = qw(Exporter) }
145759b3d2Safresh1
155759b3d2Safresh1sub set_meta {
165759b3d2Safresh1    my $self = shift;
175759b3d2Safresh1    my ($key, $value) = @_;
185759b3d2Safresh1
195759b3d2Safresh1    validate_key($key);
205759b3d2Safresh1
215759b3d2Safresh1    $self->{+META_KEY} ||= {};
225759b3d2Safresh1    $self->{+META_KEY}->{$key} = $value;
235759b3d2Safresh1}
245759b3d2Safresh1
255759b3d2Safresh1sub get_meta {
265759b3d2Safresh1    my $self = shift;
275759b3d2Safresh1    my ($key) = @_;
285759b3d2Safresh1
295759b3d2Safresh1    validate_key($key);
305759b3d2Safresh1
315759b3d2Safresh1    my $meta = $self->{+META_KEY} or return undef;
325759b3d2Safresh1    return $meta->{$key};
335759b3d2Safresh1}
345759b3d2Safresh1
355759b3d2Safresh1sub delete_meta {
365759b3d2Safresh1    my $self = shift;
375759b3d2Safresh1    my ($key) = @_;
385759b3d2Safresh1
395759b3d2Safresh1    validate_key($key);
405759b3d2Safresh1
415759b3d2Safresh1    my $meta = $self->{+META_KEY} or return undef;
425759b3d2Safresh1    delete $meta->{$key};
435759b3d2Safresh1}
445759b3d2Safresh1
455759b3d2Safresh1sub meta {
465759b3d2Safresh1    my $self = shift;
475759b3d2Safresh1    my ($key, $default) = @_;
485759b3d2Safresh1
495759b3d2Safresh1    validate_key($key);
505759b3d2Safresh1
515759b3d2Safresh1    my $meta = $self->{+META_KEY};
525759b3d2Safresh1    return undef unless $meta || defined($default);
535759b3d2Safresh1
545759b3d2Safresh1    unless($meta) {
555759b3d2Safresh1        $meta = {};
565759b3d2Safresh1        $self->{+META_KEY} = $meta;
575759b3d2Safresh1    }
585759b3d2Safresh1
595759b3d2Safresh1    $meta->{$key} = $default
605759b3d2Safresh1        if defined($default) && !defined($meta->{$key});
615759b3d2Safresh1
625759b3d2Safresh1    return $meta->{$key};
635759b3d2Safresh1}
645759b3d2Safresh1
655759b3d2Safresh1sub validate_key {
665759b3d2Safresh1    my $key = shift;
675759b3d2Safresh1
685759b3d2Safresh1    return if $key && !ref($key);
695759b3d2Safresh1
705759b3d2Safresh1    my $render_key = defined($key) ? "'$key'" : 'undef';
715759b3d2Safresh1    croak "Invalid META key: $render_key, keys must be true, and may not be references";
725759b3d2Safresh1}
735759b3d2Safresh1
745759b3d2Safresh11;
755759b3d2Safresh1
765759b3d2Safresh1__END__
775759b3d2Safresh1
785759b3d2Safresh1=pod
795759b3d2Safresh1
805759b3d2Safresh1=encoding UTF-8
815759b3d2Safresh1
825759b3d2Safresh1=head1 NAME
835759b3d2Safresh1
845759b3d2Safresh1Test2::Util::ExternalMeta - Allow third party tools to safely attach meta-data
855759b3d2Safresh1to your instances.
865759b3d2Safresh1
875759b3d2Safresh1=head1 DESCRIPTION
885759b3d2Safresh1
895759b3d2Safresh1This package lets you define a clear, and consistent way to allow third party
905759b3d2Safresh1tools to attach meta-data to your instances. If your object consumes this
915759b3d2Safresh1package, and imports its methods, then third party meta-data has a safe place
925759b3d2Safresh1to live.
935759b3d2Safresh1
945759b3d2Safresh1=head1 SYNOPSIS
955759b3d2Safresh1
965759b3d2Safresh1    package My::Object;
975759b3d2Safresh1    use strict;
985759b3d2Safresh1    use warnings;
995759b3d2Safresh1
1005759b3d2Safresh1    use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/;
1015759b3d2Safresh1
1025759b3d2Safresh1    ...
1035759b3d2Safresh1
1045759b3d2Safresh1Now to use it:
1055759b3d2Safresh1
1065759b3d2Safresh1    my $inst = My::Object->new;
1075759b3d2Safresh1
1085759b3d2Safresh1    $inst->set_meta(foo => 'bar');
1095759b3d2Safresh1    my $val = $inst->get_meta('foo');
1105759b3d2Safresh1
1115759b3d2Safresh1=head1 WHERE IS THE DATA STORED?
1125759b3d2Safresh1
1135759b3d2Safresh1This package assumes your instances are blessed hashrefs, it will not work if
1145759b3d2Safresh1that is not true. It will store all meta-data in the C<_meta> key on your
1155759b3d2Safresh1objects hash. If your object makes use of the C<_meta> key in its underlying
1165759b3d2Safresh1hash, then there is a conflict and you cannot use this package.
1175759b3d2Safresh1
1185759b3d2Safresh1=head1 EXPORTS
1195759b3d2Safresh1
1205759b3d2Safresh1=over 4
1215759b3d2Safresh1
1225759b3d2Safresh1=item $val = $obj->meta($key)
1235759b3d2Safresh1
1245759b3d2Safresh1=item $val = $obj->meta($key, $default)
1255759b3d2Safresh1
1265759b3d2Safresh1This will get the value for a specified meta C<$key>. Normally this will return
1275759b3d2Safresh1C<undef> when there is no value for the C<$key>, however you can specify a
1285759b3d2Safresh1C<$default> value to set when no value is already set.
1295759b3d2Safresh1
1305759b3d2Safresh1=item $val = $obj->get_meta($key)
1315759b3d2Safresh1
1325759b3d2Safresh1This will get the value for a specified meta C<$key>. This does not have the
1335759b3d2Safresh1C<$default> overhead that C<meta()> does.
1345759b3d2Safresh1
1355759b3d2Safresh1=item $val = $obj->delete_meta($key)
1365759b3d2Safresh1
1375759b3d2Safresh1This will remove the value of a specified meta C<$key>. The old C<$val> will be
1385759b3d2Safresh1returned.
1395759b3d2Safresh1
1405759b3d2Safresh1=item $obj->set_meta($key, $val)
1415759b3d2Safresh1
1425759b3d2Safresh1Set the value of a specified meta C<$key>.
1435759b3d2Safresh1
1445759b3d2Safresh1=back
1455759b3d2Safresh1
1465759b3d2Safresh1=head1 META-KEY RESTRICTIONS
1475759b3d2Safresh1
1485759b3d2Safresh1Meta keys must be defined, and must be true when used as a boolean. Keys may
1495759b3d2Safresh1not be references. You are free to stringify a reference C<"$ref"> for use as a
1505759b3d2Safresh1key, but this package will not stringify it for you.
1515759b3d2Safresh1
1525759b3d2Safresh1=head1 SOURCE
1535759b3d2Safresh1
1545759b3d2Safresh1The source code repository for Test2 can be found at
155*5486feefSafresh1L<https://github.com/Test-More/test-more/>.
1565759b3d2Safresh1
1575759b3d2Safresh1=head1 MAINTAINERS
1585759b3d2Safresh1
1595759b3d2Safresh1=over 4
1605759b3d2Safresh1
1615759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
1625759b3d2Safresh1
1635759b3d2Safresh1=back
1645759b3d2Safresh1
1655759b3d2Safresh1=head1 AUTHORS
1665759b3d2Safresh1
1675759b3d2Safresh1=over 4
1685759b3d2Safresh1
1695759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
1705759b3d2Safresh1
1715759b3d2Safresh1=back
1725759b3d2Safresh1
1735759b3d2Safresh1=head1 COPYRIGHT
1745759b3d2Safresh1
175256a93a4Safresh1Copyright 2020 Chad Granum E<lt>exodist@cpan.orgE<gt>.
1765759b3d2Safresh1
1775759b3d2Safresh1This program is free software; you can redistribute it and/or
1785759b3d2Safresh1modify it under the same terms as Perl itself.
1795759b3d2Safresh1
180*5486feefSafresh1See L<https://dev.perl.org/licenses/>
1815759b3d2Safresh1
1825759b3d2Safresh1=cut
183