#line 1
##############################################################################
#      $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/distributions/Perl-Critic/lib/Perl/Critic/PolicyParameter/Behavior/Integer.pm $
#     $Date: 2011-12-21 14:40:10 -0800 (Wed, 21 Dec 2011) $
#   $Author: thaljef $
# $Revision: 4106 $
##############################################################################

package Perl::Critic::PolicyParameter::Behavior::Integer;

use 5.006001;
use strict;
use warnings;

use Perl::Critic::Utils qw{ :characters };

use base qw{ Perl::Critic::PolicyParameter::Behavior };

our $VERSION = '1.117';

#-----------------------------------------------------------------------------

sub initialize_parameter {
    my ($self, $parameter, $specification) = @_;

    my $minimum = $specification->{integer_minimum};
    my $maximum = $specification->{integer_maximum};

    $parameter->_get_behavior_values()->{minimum} = $minimum;
    $parameter->_get_behavior_values()->{maximum} = $maximum;

    $parameter->_set_parser(
        sub {
            # Normally bad thing, obscuring a variable in a outer scope
            # with a variable with the same name is being done here in
            # order to remain consistent with the parser function interface.
            my ($policy, $parameter, $config_string) = @_;  ## no critic(Variables::ProhibitReusedNames)

            my $value_string = $parameter->get_default_string();

            if (defined $config_string) {
                $value_string = $config_string;
            }

            my $value;
            if ( defined $value_string ) {
                if (
                        $value_string !~ m/ \A [-+]? [1-9] [\d_]* \z /xms
                    and $value_string ne '0'
                ) {
                    $policy->throw_parameter_value_exception(
                        $parameter->get_name(),
                        $value_string,
                        undef,
                        'does not look like an integer.',
                    );
                }

                $value_string =~ tr/_//d;
                $value = $value_string + 0;

                if ( defined $minimum and $minimum > $value ) {
                    $policy->throw_parameter_value_exception(
                        $parameter->get_name(),
                        $value_string,
                        undef,
                        qq{is less than $minimum.},
                    );
                }

                if ( defined $maximum and $maximum < $value ) {
                    $policy->throw_parameter_value_exception(
                        $parameter->get_name(),
                        $value_string,
                        undef,
                        qq{is greater than $maximum.},
                    );
                }
            }

            $policy->__set_parameter_value($parameter, $value);
            return;
        }
    );

    return;
}

#-----------------------------------------------------------------------------

sub generate_parameter_description {
    my ($self, $parameter) = @_;

    my $minimum = $parameter->_get_behavior_values()->{minimum};
    my $maximum = $parameter->_get_behavior_values()->{maximum};

    my $description = $parameter->_get_description_with_trailing_period();
    if ( $description ) {
        $description .= qq{\n};
    }

    if (defined $minimum or defined $maximum) {
        if (defined $minimum) {
            $description .= "Minimum value $minimum. ";
        } else {
            $description .= 'No minimum. ';
        }

        if (defined $maximum) {
            $description .= "Maximum value $maximum.";
        } else {
            $description .= 'No maximum.';
        }
    } else {
        $description .= 'No limits.';
    }

    return $description;
}

#-----------------------------------------------------------------------------

1;

__END__

#-----------------------------------------------------------------------------

#line 208

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 78
#   indent-tabs-mode: nil
#   c-indentation-style: bsd
# End:
# ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :
