package Bash::Completion::Request;
{
  $Bash::Completion::Request::VERSION = '0.008';
}

# ABSTRACT: Abstract a completion request

use strict;
use warnings;


sub line { return $_[0]{line} }



sub word { return $_[0]{word} }



sub args { return @{$_[0]{args}} }



sub count { return $_[0]{count} }



sub point { return $_[0]{point} }



sub new {
  my ($class) = @_;

  return bless {
    candidates => [],

    line  => $ENV{COMP_LINE},
    point => $ENV{COMP_POINT},
    _get_completion_word(),
    _get_arguments(),
  }, $class;
}



sub candidates {
  my $self = shift;
  my $c    = $self->{candidates};

  return @$c unless @_;

  push @$c, @_;
}


#######
# Utils

## Stolen from http://github.com/yanick/dist-zilla/blob/master/contrib/dzil-complete
sub _get_completion_word {
  my $comp = substr $ENV{'COMP_LINE'}, 0, $ENV{'COMP_POINT'};
  $comp =~ s/.*\s//;
  return word => $comp;
}

sub _get_arguments {
  my $comp = substr $ENV{'COMP_LINE'}, 0, $ENV{'COMP_POINT'};
  my @args = split(/\s+/, $comp);

  return args => \@args, count => scalar(@args);
}


1;

__END__
=pod

=head1 NAME

Bash::Completion::Request - Abstract a completion request

=head1 VERSION

version 0.008

=head1 ATTRIBUTES

=head2 line

The full command line as given to us by bash.

=head2 word

The word to be completed.

=head2 args

The command line, up to and including the word to be completed, as a list of terms.

The split of the command line into terms is very very basic. There might be dragons here.

=head2 count

Number of words in the command line before the completion point.

=head2 point

The index in the command line where the shell cursor is.

=head1 METHODS

=head2 new

Constructs a completion request object based on the bash environment
variables: C<COMP_LINE> and C<COMP_POINT>.

=head2 candidates

Accepts a list of completion candidates and passes them on to the shell.

=head1 AUTHOR

Pedro Melo <melo@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2011 by Pedro Melo.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)

=cut