Acme-Sub-Parms
view release on metacpan or search on metacpan
lib/Acme/Sub/Parms.pm view on Meta::CPAN
$escape_next = 1;
} elsif ($ch eq $quote) {
$block_done = 1;
} else {
$token .= $ch;
}
}
if ($escape_next) {
die("Syntax error in BindParms spec: $raw_spec\n");
}
$spec = reverse $upend_spec;
$spec_tokens->{$spec_key} = $token . $quote;
} else {
die("Syntax error in BindParms spec: $raw_spec\n");
}
} else {
die("Syntax error in BindParms spec: $raw_spec\n");
}
}
return $spec_tokens;
}
###############################################################################
# bind_spec is intentionally a a non-POD documented'public' method. It can be overridden in a sub-class
# to provide alternative features.
#
# It takes two parameters:
#
# $raw_spec - this is the content of the [....] block (not including the '[' and ']' block delimitters)
# $field_name - the hash key for the field being processed
#
# As each line of the BindParms block is processed the two parameters for each line are passed to the bind_spec
# method for evaluation. bind_spec should return a string containing any Perl code generated as a result of
# the bind specification.
#
# Good style dictates that the returned output should be *ONE* line (it could be a very *long* line)
# so that line numbering in the source file is preserved for any error messages.
#
sub bind_spec {
my $self = shift;
my ($raw_spec, $field_name) = @_;
my $options = $self->{'options'};
my $no_validation = $options->{_NO_VALIDATION()};
my $spec_tokens = $self->_parse_bind_spec($raw_spec);
lib/Acme/Sub/Parms.pm view on Meta::CPAN
$output .= "unless (exists (\$Acme::Sub::Parms::args\{'$field_name'\})) \{ \$Acme::Sub::Parms::args\{'$field_name'\} = " . $spec_tokens->{'default'} . ";\} ";
} else { # required
$output .= "unless (defined (\$Acme::Sub::Parms::args\{'$field_name'\})) \{ \$Acme::Sub::Parms::args\{'$field_name'\} = " . $spec_tokens->{'default'} . ";\} ";
}
$has_side_effects = 1;
}
######################
# callback="some_subroutine"
if ($spec_tokens->{'callback'}) {
$output .= "\{ my (\$callback_is_valid, \$callback_error) = "
. $spec_tokens->{'callback'}
. "(\'$field_name\', \$Acme::Sub::Parms::args\{\'$field_name\'\}, \\\%Acme::Sub::Parms::args);"
. "unless (\$callback_is_valid) { require Carp; Carp::croak(\"$field_name error: \$callback_error\"); }} ";
$has_side_effects = 1;
}
######################
# required
if ((! $no_validation) && $spec_tokens->{'required'}) {
$output .= "unless (exists (\$Acme::Sub::Parms::args\{\'$field_name\'\})) { require Carp; Carp::croak(\"Missing required parameter \'$field_name\'\"); } ";
}
######################
lib/Acme/Sub/Parms.pod view on Meta::CPAN
the $arguments_anon_hash is a 'live' reference to a hash containing
all of the arguments being processed by BindParms block.
Because it is a 'live' hash reference, alterations to the hash will be
reflected in subsequent binding lines and in the final values bound.
This is a powerful, but simultaneously very dangerous feature. Use
this ability with caution.
The callback must return either a true or a false value (not the
literal words 'true' or 'false' but something that evaluates to
a true or false logical value) and a string with an error message
(if a false value was returned.)
Callback function example:
# Checking if the field value is an integer
sub _is_integer {
my ($field_name, $field_value, $args_hash) = @_;
unless (defined ($field_value)) { return (0, 'Not defined'); }
unless (int($field_value) eq $field_value) { return (0, 'Not an integer'); }
return 1;
lib/Acme/Sub/Parms.pod view on Meta::CPAN
GitHub repo to metadata.
1.02 2008.05.17 - Permissions fixes for build tools and added more examples
1.01 2008.05.16 - Fixed minor permissions problem
1.00 2008.05.13 - Initial public release.
=head1 ERRORS
Syntactic errors using Acme::Sub::Parms will generally cause
compilation errors near (but probably not exactly at) the line
containing the error. When you see that kind of error, look for a
syntax error in the declaration.
=head1 BUGS
You can't used parameters names containing single or double quotes,
whitespace or the '[' character. Line numbering can sometimes get
thrown off a little in error messages and I haven't been able to figure
a fix out yet.
=head1 TODO
Handle multiline argument declarations. Handle comments on BindParm
lines. Generate thread-safe parameter parsing code. Handle parameter
names containing single or double quotes, whitespace or the '[' character.
Make error messages always align with the source lines.
=head1 AUTHOR
Jerilyn Franz <cpan@jerilyn.info>
=head1 VERSION
Version 1.03 - 2020.10.12
=head1 COPYRIGHT
t/01_validating.t view on Meta::CPAN
my $defaulted : dthing [optional, default="help me"];
)
unless (defined($handle) and defined($thing)) {
return 'failed to parse named parameters';
}
return '';
};
if (not defined $result) {
$result = "fatal error $@";
}
return $result;
}
###
package Acme::Sub::Parms::TestObject;
sub param {
t/02_no_validation.t view on Meta::CPAN
my $also_bogus : also_bogus [required];
)
unless (defined($handle) and defined($thing)) {
return 'failed to parse named parameters';
}
return '';
};
if (not defined $result) {
$result = "fatal error $@";
}
return $result;
}
###
package Acme::Sub::Parms::TestObject;
sub param {
t/03_normalized_validating.t view on Meta::CPAN
my $defaulted : dthing [optional, default="help me"];
)
unless (defined($handle) and defined($thing)) {
return 'failed to parse named parameters';
}
return '';
};
if (not defined $result) {
$result = "fatal error $@";
}
return $result;
}
###
package Acme::Sub::Parms::TestObject;
sub param {
t/04_normalized_no_validation.t view on Meta::CPAN
my $also_bogus : also_bogus [required];
)
unless (defined($handle) and defined($thing)) {
return 'failed to parse named parameters';
}
return '';
};
if (not defined $result) {
$result = "fatal error $@";
}
return $result;
}
###
package Acme::Sub::Parms::TestObject;
sub param {
( run in 0.713 second using v1.01-cache-2.11-cpan-65fba6d93b7 )