The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Tk;
use Term::ReadLine 1.09;

use File::Basename;
use lib dirname($0) . '/lib';
use ExampleHelpers qw(
  initialize_completion update_time print_input
);

our $mw = MainWindow->new(-title => '');
$mw->withdraw();

my $w; $w = sub { update_time(); Tk::after($mw, 1000, $w) };
Tk::after($mw, 1000, $w);

my $term = Term::ReadLine->new('...');
initialize_completion($term);

# set up the event loop callbacks.
my $fh; # so we can save it to unhook later.
$term->event_loop(
                  sub {
                      my $data = shift;
                      Tk::DoOneEvent(0) until $$data;
                      $$data = 0;
                  },
                  sub {
                      $fh = shift;
                      my $data;
                      $$data = 0;
                      Tk->fileevent($fh, 'readable', sub { $$data = 1 });
                      $data;
                  }
                 );

my $input = $term->readline('> ');

# when we're completely done, we can do this.  Note that this still does not
# allow us to create a second T::RL, so only do this when your process
# will not use T::RL ever again.  Most of the time we shouldn't need this,
# though some event loops may require this.  Reading AnyEvent::Impl::Tk
# seems to imply that not cleaning up may cause crashes, for example.
$term->event_loop(undef);

# unhook our fileevent:
Tk->fileevent($fh, 'readable', "");

print_input($input);