...
use Handlers::Library qw/:handlers/;
...
open my $filehandle, '>', 'output.xml' or die ">output.xml:$!";
my $p = XML::Twig->new(
twig_handlers => { foo => \&foo_handler },
);
I'm going to end up doing what I was trying to avoid in the first place: passing a filehandle to all of the ->flush calls. When I asked the original question, I figured this was something XML::Twig would naturally support. (It's wonderfully DWIMmy, and does something similar for defaulting a filehandle with twig_print_outside_roots => $filehandle, but I didn't realize that that was just a select.)
So, long story short, my final code will be something like: (untested)
package Handlers::Library;
my $twig_fh;
BEGIN { $twig_fh = *STDOUT; }
sub twig_output {
my $name = shift;
open $twig_fh, '>', $name or die ">$name: $!";
}
sub foo_handler { ... $twig->flush($twig_fh) }
sub bar_handler { ... $twig->flush($twig_fh) }
use Handlers::Library qw/:handlers/;
twig_output('output.xml');
my $p = XML::Twig->new(...);
|