The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Getopt::ArgParse::ActionStore;

use strict;
use warnings;
use Carp;

use Getopt::ArgParse::Parser;

sub apply {
    my $self = shift;

    my ($spec, $namespace, $values) = @_;
    $values ||= [];

    return sprintf(
        '%s can only have one value',
        $spec->{dest},
    ) if @$values > 1;

    if ($spec->{type} == Getopt::ArgParse::Parser::TYPE_BOOL) {
        # If there is default true or false
        my $default = $spec->{default} || [ 0 ];

        if (@$values) {
             # Negate the default if the arg appears on the command
             # line
            $namespace->set_attr($spec->{dest}, !$default->[0]);
        } else {
            $namespace->set_attr($spec->{dest}, $default->[0]);
        }

        # make no_arg available
        $namespace->set_attr( 'no_' . $spec->{dest}, !$namespace->get_attr($spec->{dest}) );

        return;
    }

    # Don't set it to undef. We may operate on a namespace with this
    # attr already set. In that case we don't want to override it.
    return unless @$values;

    my $v = $values->[0];

    $namespace->set_attr($spec->{dest}, $v);

    return '';
}

1;