package Module::Checkstyle::Problem;

use strict;
use warnings;

use overload q{""} => \&as_string;

sub new {
    my ($class, $severity, $message, $line, $file) = @_;

    $class = ref $class || $class;
    $line = $line->[0] if defined $line && ref $line eq 'ARRAY';

    my $self = bless [ $severity, $message, $line, $file ], $class;
    return $self;
}

sub as_string {
    my $self = shift;

    my $str = q{};
    if (defined $self->[0]) {
        $str .= uc("[$self->[0]] ");
    }

    if (defined $self->[1]) {
        $str .= $self->[1];
    }
    
    if (defined $self->[2]) {
        $str .= " at line $self->[2]";
    }
    if (defined $self->[3]) {
        $str .= " in $self->[3]";
    }

    return $str;
}

sub get_severity {
    return $_[0]->[0];
}

sub get_message {
    return $_[0]->[1];
}

sub get_line {
    return $_[0]->[2];
}

sub get_file {
    return $_[0]->[3];
}

1;
__END__
=head1 NAME

Module::Checkstyle::Problem - Represents a checkstyle violation

=head1 SYNOPSIS

    use Module::Checkstyle::Problem;

    my $problem = Module::Checkstyle::Problem->new('warn',
                                                   q(bad variable name '$java'),
                                                   40,
                                                   'my_script.pl');

=head1 DESCRIPTION

=head1 METHODS

=over 4

=item new ($severity, $message, $line, $file)

Constructs a new C<Module::Checkstyle::Problem> object. C<$severity> should be
any of B<error> or B<warn> but others may be specified. C<$message> should be
a description of the violated check. C<$line> may either be a scalar or a
reference to an array where it will use the first element as line. C<$file> should
be the path to the file that violates the check.

=item get_severity

Returns the severity of the problem.

=item get_message

Returns the description of the problem.

=item get_line

Returns the line where the problem was found.

=item get_file

Returns the file that caused the problem.

=item as_string

Returns a stringified message combining severity, message, line and file if
they are present.

=back

=head1 SEE ALSO

L<Module::Checkstyle>

=cut
