The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Text::MatchedPosition;
use strict;
use warnings;
use utf8;
use Class::Accessor::Lite (
    ro => [qw/text regex/],
);

our $VERSION = '0.02';

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

    my $args = +{};

    $args->{text} = (ref $text eq 'SCALAR') ? $$text : $text;

    if (ref $regex ne 'Regexp') {
        require Carp;
        Carp::croak("The 2nd arg requires 'Regexp': $regex");
    }
    $args->{regex} = $regex;

    bless $args, $class;
}

sub line {
    my $self = shift;

    $self->_position unless $self->{position};

    return ${$self->{position}}[0];
}

sub offset {
    my $self = shift;

    $self->_position unless $self->{position};

    return ${$self->{position}}[1];
}

sub _position {
    my $self = shift;

    unless ($self->text =~ $self->regex) {
        $self->{position} = [undef, undef];
        return;
    }

    my $match = (split $self->regex, $self->text)[0];
    $match =~ s/\x0D\x0A/\n/g;
    $match =~ tr/\r/\n/;

    my $line_count = ($match =~ s/\n/\n/g);
    $line_count++;

    my $offset = length( (split /\n/, $match, -1)[-1] || '' ) + 1;

    $self->{position} = [$line_count, $offset];
}

1;

__END__

=head1 NAME

Text::MatchedPosition - find the matched position in a text


=head1 SYNOPSIS

    use Text::MatchedPosition;
    
    my $text = <<"_TEXT_";
    01234567890
    abcdefghijklmn
    opqrstuvwxyz
    _TEXT_
    
    my $regex = qr/jk/;
    
    my $pos = Text::MatchedPosition->new(\$text, $regex);
    warn $pos->line, $pos->offset; # 2, 10


=head1 DESCRIPTION

Text::MatchedPosition is the module for finding the matched position in a text.

=head1 METHODS

=head2 new($text_ref || $text, $regex)

This is the constractor method.

=head2 line

return the count of line number. The beginning is C<1>;

If regex is no match, C<line> to be C<undef>.

=head2 offset

return the count of offset number. The beginning is C<1>;

If regex is no match, C<offset> to be C<undef>.


=head1 REPOSITORY

Text::MatchedPosition is hosted on github
<http://github.com/bayashi/Text-MatchedPosition>

Welcome your patches and issues :D


=head1 AUTHOR

Dai Okabayashi E<lt>bayashi@cpan.orgE<gt>


=head1 LICENSE

This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself. See L<perlartistic>.

=cut