Test2::...Grabber(3)

πŸ“¦ version 1.302214, in opensuse-leap 16.0

πŸ’– NAME πŸ’–

Bestie, this is the Test2::...Grabber(3) page β€” aka Test2::Util::Grabber β€” from the User Contributed Perl Documentation. It’s literally an object used to temporarily intercept all events. Yes, all of them. Iconic behavior. πŸ’…

🌸 DESCRIPTION 🌸

Once created, this object will intercept and stash all events sent to the shared Test2::Hub object. Once the object is destroyed, events will once again be sent to the shared hub. It’s giving temporary main-character portal energy. ✨

πŸ¦‹ SYNOPSIS πŸ¦‹

use Test2 qw/Core Grab/;

my $grab = grab();

# Generate some events, they are intercepted.
ok(1, "pass");
ok(0, "fail");

my $events_a = $grab->flush;

# Generate some more events, they are intercepted.
ok(1, "pass");
ok(0, "fail");

# Same as flush, except it destroys the grab object.
my $events_b = $grab->finish;

After calling finish() the grab object is destroyed and $grab is set to undef. $events_a is an arrayref with the first two events. $events_b is an arrayref with the second two events. Slay, the math is mathing. πŸŽ€

🫢 EXPORTS 🫢

πŸ’œ $grab = grab()

This lets you intercept all events for a section of code without adding anything to your call stack. This is useful for things that are sensitive to changes in the stack depth. No cap, stack-depth girlies need this. 🧚

my $grab = grab();
    ok(1, 'foo');
    ok(0, 'bar');

# $grab is magically undef after this.
my $events = $grab->finish;

is(@$events, 2, "grabbed two events.");

When you call finish() the $grab object will automagically undef itself, but only for the reference used in the method call. If you have other references to the $grab object they will not be set to undef. Important distinction, bestie. πŸ”₯

If the $grab object is destroyed without calling finish(), it will automatically clean up after itself and restore the parent hub. Very responsible of it, ngl. 🌈

{
    my $grab = grab();
    # Things are grabbed
}
# Things are back to normal

By default the hub used has "no_ending" set to true. This will prevent the hub from enforcing that you issued a plan and ran at least one test. You can turn enforcement back one like this:

$grab->hub->set_no_ending(0);

With "no_ending" turned off, finish will run the post-test checks to enforce the plan and that tests were run. In many cases this will result in additional events in your events array. Surprise events, but make it official. 😭

πŸŽ€ METHODS πŸŽ€

  • $grab = $class->new() β€” Create a new grab object, and it immediately starts intercepting events. It does not wait. It does not chill. It grabs. πŸ’…
  • $ar = $grab->flush() β€” Get an arrayref of all the events so far, clearing the grab object’s internal list. It’s a little reset moment. ✨
  • $ar = $grab->events() β€” Get an arrayref of all events so far. Does not clear the internal list. Look, don’t touch. πŸ‘€
  • $ar = $grab->finish() β€” Get an arrayref of all the events, then destroy the grab object. It ate and then left. πŸ”₯
  • $hub = $grab->hub() β€” Get the hub that is used by the grab event.

🌟 ENDING BEHAVIOR 🌟

Okay so this is the same tea as above, but it’s important so here it is again:

By default the hub used has "no_ending" set to true. This will prevent the hub from enforcing that you issued a plan and ran at least one test. You can turn enforcement back one like this:

$grab->hub->set_no_ending(0);

With "no_ending" turned off, finish will run the post-test checks to enforce the plan and that tests were run. In many cases this will result in additional events in your events array. Extra events are extra events, periodt. πŸ’€

πŸ‘€ SEE ALSO πŸ‘€

  • Test2::Tools::Intercept β€” Accomplish the same thing, but using blocks instead. Block-based bestie energy. 🫢

πŸ“¦ SOURCE πŸ“¦

The source code repository for Test2 can be found at https://github.com/Test-More/test-more/. Go look, bestie. πŸ”

πŸ‘‘ MAINTAINERS πŸ‘‘

Chad Granum <exodist@cpan.org>

πŸ’ AUTHORS πŸ’

Chad Granum <exodist@cpan.org>

Copyright Chad Granum <exodist@cpan.org>.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See http://dev.perl.org/licenses/


Bye bestie 🫢 this page’s source/version is perl v5.42.0, it’s dated 2025-07-28, and the manual is Test2::...Grabber(3). Mwah πŸ’‹

πŸ“¦ where this page comes from