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