Help language development. Donate to The Perl Foundation
IO::MiddleMan - hijack, capture, or mute writes to an IO::Handle
my $mm = IO::MiddleMan.hijack: $*OUT; say "Can't see this yet!"; $mm.mode = 'normal'; say "Want to see what I said?"; say "Well, fine. I said $mm"; my $fh = 'some-file'.IO.open: :w; my $mm = IO::MiddleMan.capture: $fh; $fh.say: 'test', 42; say "We wrote $mm into some-file"; IO::MiddleMan.mute: $*ERR; note "you'll never see this!";
This module allows you to inject yourself in the middle between an IO::Handle
and things writing into it. You can completely hijack the data, merely capture
it, or discard it entirely.
.data
say Currently captured things are " $mm.data.join: ''; $mm.data = () unless $mm.data.grep: {/secrets/}; say "Haven't seen any secrets yet. Restarted the capture";
An array that contains data captured by .hijack
and
.capture
methods. Each operation on the filehandle add one
element to .data
; those operations are calls to .print
, .print-nl
,
.say
, and .put
methods on the original filehandle. Note that .data
added with .say
/.put
will have \n
added to it already.
.handle
my $mm = IO::MiddleMan.mute: $*OUT; say "This is muted"; $mm.handle.say: "But this still works!";
The original IO::Handle
. You can still successfully call data methods on it,
and no captures will be done, regardless of what the IO::MiddleMan
.mode
is.
.mode
my $mm = IO::MiddleMan.hijack: $*OUT; say "I'm hijacked!"; $mm.mode = 'normal'; say "Now things are back to normal";
Sets operational mode for the IO::MiddleMan
. Valid modes are
capture
, hijack
, mute
, and
normal
. See methods of the corresponding name for the
description of the behavior these modes enable.
.capture
my $mm = IO::MiddleMan.capture: $*OUT; say "I'm watching you";
Creates and returns a new IO::MiddleMan
object set to capture all the data
sent to the IO::Handle
given as the positional argument. Any writes to the
original IO::Handle
will proceed as normal, while also being stored in
.data
accessor.
.hijack
my $mm = IO::MiddleMan.hijack: $*OUT; say "Can't see this yet!";
Creates and returns a new IO::MiddleMan
object set to hijack all the data
sent to the IO::Handle
given as the positional argument. Any writes to the
original IO::Handle
will NOT reach it and instead will be stored in
.data
accessor.
.mute
my $mm = IO::MiddleMan.mute: $*OUT; say "You'll never see this!";
Creates and returns a new IO::MiddleMan
object set to ignore all the data
sent to the IO::Handle
given as the positional argument.
.normal
my $mm = IO::MiddleMan.normal: $*OUT; say "Things look perfectly normal";
Creates and returns a new IO::MiddleMan
object set to send all the data
sent to the IO::Handle
given as the positional argument as it normally would
and no capturing of it is to be done.
.Str
say "Captured $mm";
This module overrides the .Str
method to return all the
captured data as a string.
The module currently only operates on non-binary data (i.e. write
method
is still native to IO::Handle
). Patches are welcome.
The given filehandle must be a writable container and its contents will
be changed to the IO::MiddleMan
object, thus possibly complicating some
operations.
Fork this module on GitHub: https://github.com/raku-community-modules/IO-MiddleMan
To report bugs or request features, please use https://github.com/raku-community-modules/IO-MiddleMan/issues
Zoffix Znet (http://zoffix.com/)
You can use and distribute this module under the terms of the
The Artistic License 2.0. See the LICENSE
file included in this
distribution for complete details.