xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
15759b3d2Safresh1package Test2::API::Stack;
25759b3d2Safresh1use strict;
35759b3d2Safresh1use warnings;
45759b3d2Safresh1
5*5486feefSafresh1our $VERSION = '1.302199';
65759b3d2Safresh1
75759b3d2Safresh1
85759b3d2Safresh1use Test2::Hub();
95759b3d2Safresh1
105759b3d2Safresh1use Carp qw/confess/;
115759b3d2Safresh1
125759b3d2Safresh1sub new {
135759b3d2Safresh1    my $class = shift;
145759b3d2Safresh1    return bless [], $class;
155759b3d2Safresh1}
165759b3d2Safresh1
175759b3d2Safresh1sub new_hub {
185759b3d2Safresh1    my $self = shift;
195759b3d2Safresh1    my %params = @_;
205759b3d2Safresh1
215759b3d2Safresh1    my $class = delete $params{class} || 'Test2::Hub';
225759b3d2Safresh1
235759b3d2Safresh1    my $hub = $class->new(%params);
245759b3d2Safresh1
255759b3d2Safresh1    if (@$self) {
265759b3d2Safresh1        $hub->inherit($self->[-1], %params);
275759b3d2Safresh1    }
285759b3d2Safresh1    else {
295759b3d2Safresh1        require Test2::API;
305759b3d2Safresh1        $hub->format(Test2::API::test2_formatter()->new_root)
315759b3d2Safresh1            unless $hub->format || exists($params{formatter});
325759b3d2Safresh1
335759b3d2Safresh1        my $ipc = Test2::API::test2_ipc();
345759b3d2Safresh1        if ($ipc && !$hub->ipc && !exists($params{ipc})) {
355759b3d2Safresh1            $hub->set_ipc($ipc);
365759b3d2Safresh1            $ipc->add_hub($hub->hid);
375759b3d2Safresh1        }
385759b3d2Safresh1    }
395759b3d2Safresh1
405759b3d2Safresh1    push @$self => $hub;
415759b3d2Safresh1
425759b3d2Safresh1    $hub;
435759b3d2Safresh1}
445759b3d2Safresh1
455759b3d2Safresh1sub top {
465759b3d2Safresh1    my $self = shift;
475759b3d2Safresh1    return $self->new_hub unless @$self;
485759b3d2Safresh1    return $self->[-1];
495759b3d2Safresh1}
505759b3d2Safresh1
515759b3d2Safresh1sub peek {
525759b3d2Safresh1    my $self = shift;
535759b3d2Safresh1    return @$self ? $self->[-1] : undef;
545759b3d2Safresh1}
555759b3d2Safresh1
565759b3d2Safresh1sub cull {
575759b3d2Safresh1    my $self = shift;
585759b3d2Safresh1    $_->cull for reverse @$self;
595759b3d2Safresh1}
605759b3d2Safresh1
615759b3d2Safresh1sub all {
625759b3d2Safresh1    my $self = shift;
635759b3d2Safresh1    return @$self;
645759b3d2Safresh1}
655759b3d2Safresh1
66de8cc8edSafresh1sub root {
67de8cc8edSafresh1    my $self = shift;
68de8cc8edSafresh1    return unless @$self;
69de8cc8edSafresh1    return $self->[0];
70de8cc8edSafresh1}
71de8cc8edSafresh1
725759b3d2Safresh1sub clear {
735759b3d2Safresh1    my $self = shift;
745759b3d2Safresh1    @$self = ();
755759b3d2Safresh1}
765759b3d2Safresh1
775759b3d2Safresh1# Do these last without keywords in order to prevent them from getting used
785759b3d2Safresh1# when we want the real push/pop.
795759b3d2Safresh1
805759b3d2Safresh1{
815759b3d2Safresh1    no warnings 'once';
825759b3d2Safresh1
835759b3d2Safresh1    *push = sub {
845759b3d2Safresh1        my $self = shift;
855759b3d2Safresh1        my ($hub) = @_;
865759b3d2Safresh1        $hub->inherit($self->[-1]) if @$self;
875759b3d2Safresh1        push @$self => $hub;
885759b3d2Safresh1    };
895759b3d2Safresh1
905759b3d2Safresh1    *pop = sub {
915759b3d2Safresh1        my $self = shift;
925759b3d2Safresh1        my ($hub) = @_;
935759b3d2Safresh1        confess "No hubs on the stack"
945759b3d2Safresh1            unless @$self;
955759b3d2Safresh1        confess "You cannot pop the root hub"
965759b3d2Safresh1            if 1 == @$self;
975759b3d2Safresh1        confess "Hub stack mismatch, attempted to pop incorrect hub"
985759b3d2Safresh1            unless $self->[-1] == $hub;
995759b3d2Safresh1        pop @$self;
1005759b3d2Safresh1    };
1015759b3d2Safresh1}
1025759b3d2Safresh1
1035759b3d2Safresh11;
1045759b3d2Safresh1
1055759b3d2Safresh1__END__
1065759b3d2Safresh1
1075759b3d2Safresh1=pod
1085759b3d2Safresh1
1095759b3d2Safresh1=encoding UTF-8
1105759b3d2Safresh1
1115759b3d2Safresh1=head1 NAME
1125759b3d2Safresh1
1135759b3d2Safresh1Test2::API::Stack - Object to manage a stack of L<Test2::Hub>
1145759b3d2Safresh1instances.
1155759b3d2Safresh1
1165759b3d2Safresh1=head1 ***INTERNALS NOTE***
1175759b3d2Safresh1
1185759b3d2Safresh1B<The internals of this package are subject to change at any time!> The public
1195759b3d2Safresh1methods provided will not change in backwards incompatible ways, but the
1205759b3d2Safresh1underlying implementation details might. B<Do not break encapsulation here!>
1215759b3d2Safresh1
1225759b3d2Safresh1=head1 DESCRIPTION
1235759b3d2Safresh1
1245759b3d2Safresh1This module is used to represent and manage a stack of L<Test2::Hub>
1255759b3d2Safresh1objects. Hubs are usually in a stack so that you can push a new hub into place
1265759b3d2Safresh1that can intercept and handle events differently than the primary hub.
1275759b3d2Safresh1
1285759b3d2Safresh1=head1 SYNOPSIS
1295759b3d2Safresh1
1305759b3d2Safresh1    my $stack = Test2::API::Stack->new;
1315759b3d2Safresh1    my $hub = $stack->top;
1325759b3d2Safresh1
1335759b3d2Safresh1=head1 METHODS
1345759b3d2Safresh1
1355759b3d2Safresh1=over 4
1365759b3d2Safresh1
1375759b3d2Safresh1=item $stack = Test2::API::Stack->new()
1385759b3d2Safresh1
1395759b3d2Safresh1This will create a new empty stack instance. All arguments are ignored.
1405759b3d2Safresh1
1415759b3d2Safresh1=item $hub = $stack->new_hub()
1425759b3d2Safresh1
1435759b3d2Safresh1=item $hub = $stack->new_hub(%params)
1445759b3d2Safresh1
1455759b3d2Safresh1=item $hub = $stack->new_hub(%params, class => $class)
1465759b3d2Safresh1
1475759b3d2Safresh1This will generate a new hub and push it to the top of the stack. Optionally
1485759b3d2Safresh1you can provide arguments that will be passed into the constructor for the
1495759b3d2Safresh1L<Test2::Hub> object.
1505759b3d2Safresh1
1515759b3d2Safresh1If you specify the C<< 'class' => $class >> argument, the new hub will be an
1525759b3d2Safresh1instance of the specified class.
1535759b3d2Safresh1
1545759b3d2Safresh1Unless your parameters specify C<'formatter'> or C<'ipc'> arguments, the
1555759b3d2Safresh1formatter and IPC instance will be inherited from the current top hub. You can
1565759b3d2Safresh1set the parameters to C<undef> to avoid having a formatter or IPC instance.
1575759b3d2Safresh1
1585759b3d2Safresh1If there is no top hub, and you do not ask to leave IPC and formatter undef,
1595759b3d2Safresh1then a new formatter will be created, and the IPC instance from
1605759b3d2Safresh1L<Test2::API> will be used.
1615759b3d2Safresh1
1625759b3d2Safresh1=item $hub = $stack->top()
1635759b3d2Safresh1
1645759b3d2Safresh1This will return the top hub from the stack. If there is no top hub yet this
1655759b3d2Safresh1will create it.
1665759b3d2Safresh1
1675759b3d2Safresh1=item $hub = $stack->peek()
1685759b3d2Safresh1
1695759b3d2Safresh1This will return the top hub from the stack. If there is no top hub yet this
1705759b3d2Safresh1will return undef.
1715759b3d2Safresh1
1725759b3d2Safresh1=item $stack->cull
1735759b3d2Safresh1
1745759b3d2Safresh1This will call C<< $hub->cull >> on all hubs in the stack.
1755759b3d2Safresh1
1765759b3d2Safresh1=item @hubs = $stack->all
1775759b3d2Safresh1
1785759b3d2Safresh1This will return all the hubs in the stack as a list.
1795759b3d2Safresh1
1805759b3d2Safresh1=item $stack->clear
1815759b3d2Safresh1
1825759b3d2Safresh1This will completely remove all hubs from the stack. Normally you do not want
1835759b3d2Safresh1to do this, but there are a few valid reasons for it.
1845759b3d2Safresh1
1855759b3d2Safresh1=item $stack->push($hub)
1865759b3d2Safresh1
1875759b3d2Safresh1This will push the new hub onto the stack.
1885759b3d2Safresh1
1895759b3d2Safresh1=item $stack->pop($hub)
1905759b3d2Safresh1
1915759b3d2Safresh1This will pop a hub from the stack, if the hub at the top of the stack does not
1925759b3d2Safresh1match the hub you expect (passed in as an argument) it will throw an exception.
1935759b3d2Safresh1
1945759b3d2Safresh1=back
1955759b3d2Safresh1
1965759b3d2Safresh1=head1 SOURCE
1975759b3d2Safresh1
1985759b3d2Safresh1The source code repository for Test2 can be found at
199*5486feefSafresh1L<https://github.com/Test-More/test-more/>.
2005759b3d2Safresh1
2015759b3d2Safresh1=head1 MAINTAINERS
2025759b3d2Safresh1
2035759b3d2Safresh1=over 4
2045759b3d2Safresh1
2055759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2065759b3d2Safresh1
2075759b3d2Safresh1=back
2085759b3d2Safresh1
2095759b3d2Safresh1=head1 AUTHORS
2105759b3d2Safresh1
2115759b3d2Safresh1=over 4
2125759b3d2Safresh1
2135759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2145759b3d2Safresh1
2155759b3d2Safresh1=back
2165759b3d2Safresh1
2175759b3d2Safresh1=head1 COPYRIGHT
2185759b3d2Safresh1
219256a93a4Safresh1Copyright 2020 Chad Granum E<lt>exodist@cpan.orgE<gt>.
2205759b3d2Safresh1
2215759b3d2Safresh1This program is free software; you can redistribute it and/or
2225759b3d2Safresh1modify it under the same terms as Perl itself.
2235759b3d2Safresh1
224*5486feefSafresh1See L<https://dev.perl.org/licenses/>
2255759b3d2Safresh1
2265759b3d2Safresh1=cut
227