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