package Term::UI::History;
$Term::UI::History::VERSION = '0.50';

use strict;
use warnings;

use parent
  qw! Exporter
      Log::Message::Simple
    !;

use Log::Message 'private' => 0;

our $HISTORY_FH = \ *STDOUT;
our @EXPORT = qw[ history ];

my $log = Log::Message->new();

=pod

=head1 NAME

Term::UI::History - history function

=head1 SYNOPSIS

    use Term::UI::History qw[history];

    history("Some message");

    ### retrieve the history in printable form
    $hist  = Term::UI::History->history_as_string;

    ### redirect output
    local $Term::UI::History::HISTORY_FH = \*STDERR;

=head1 DESCRIPTION

This module provides the C<history> function for C<Term::UI>,
printing and saving all the C<UI> interaction.

Refer to the C<Term::UI> manpage for details on usage from
C<Term::UI>.

This module subclasses C<Log::Message::Simple>. Refer to its
manpage for additional functionality available via this package.

=head1 FUNCTIONS

=head2 history("message string" [,VERBOSE])

Records a message on the stack, and prints it to C<STDOUT>
(or actually C<$HISTORY_FH>, see the C<GLOBAL VARIABLES> section
below), if the C<VERBOSE> option is true.

The C<VERBOSE> option defaults to true.

=cut

sub history {
  my $msg = shift;

  $log
    ->store( 'message' => $msg,
             'tag' => 'HISTORY',
             'level' => 'history',
             'extra' => [ @_ ],
           );
}

sub history_as_string {
    my $class = shift;

    return join $/, map { $_->message } __PACKAGE__->stack;
}


{
    package # hide this from PAUSE
      Log::Message::Handlers;

    sub history {
        my $self    = shift;
        my $verbose = shift;
           $verbose = 1 unless defined $verbose;    # default to true

        ### so you don't want us to print the msg? ###
        return if defined $verbose && $verbose == 0;

        local $| = 1;
        my $old_fh = select $Term::UI::History::HISTORY_FH;

        print $self->message . "\n";
        select $old_fh;

        return;
    }
}


=head1 GLOBAL VARIABLES

=over 4

=item $HISTORY_FH

This is the filehandle all the messages sent to C<history()> are being
printed. This defaults to C<*STDOUT>.

=back

=head1 See Also

C<Log::Message::Simple>, C<Term::UI>

=head1 AUTHOR

This module by
Jos Boumans E<lt>kane@cpan.orgE<gt>.

=head1 COPYRIGHT

This module is
copyright (c) 2005 Jos Boumans E<lt>kane@cpan.orgE<gt>.
All rights reserved.

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

=cut

1;

# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4:
