File Coverage

blib/lib/Repl/Spec/Args/NamedArg.pm
Criterion Covered Total %
statement 43 47 91.4
branch 5 8 62.5
condition 5 11 45.4
subroutine 6 7 85.7
pod 0 4 0.0
total 59 77 76.6


line stmt bran cond sub pod time code
1             package Repl::Spec::Args::NamedArg;
2            
3 1     1   3007 use strict;
  1         3  
  1         56  
4 1     1   6 use warnings;
  1         2  
  1         34  
5 1     1   6 use Carp;
  1         2  
  1         1268  
6            
7             # Parameters:
8             # - Name of the parameter.
9             # - Type spec.
10             # - Default value.
11             # - Optional flag.
12             sub new
13             {
14 1     1 0 10 my $invocant = shift;
15 1   33     8 my $class = ref($invocant) || $invocant;
16            
17 1   50     5 my $paramName = shift || die "Parameter name expected.";
18 1   50     6 my $typeSpec = shift || die "Type spec expected.";
19 1         2 my $value = shift;
20 1         3 my $optional = shift;
21            
22 1         6 my $specName = sprintf("%s=%s", $paramName, $typeSpec->name());
23            
24 1         2 my $self = {};
25 1         9 $self->{PARAMNAME} = $paramName;
26 1         2 $self->{TYPESPEC} = $typeSpec;
27 1         2 $self->{VALUE} = $value;
28 1         2 $self->{OPTIONAL} = $optional;
29 1         3 $self->{SPECNAME} = $specName;
30            
31 1         4 return bless $self, $class;
32             }
33            
34             sub specname()
35             {
36 0     0 0 0 my $self = shift;
37 0         0 return $self->{SPECNAME};
38             }
39            
40             # Parameters:
41             # - An argument list (ref to array).
42             # - a position.
43             # - A context!
44             sub guard
45             {
46 4     4 0 8 my $self = shift;
47 4   50     10 my $args = shift || die "Argument list expected.";
48 4         6 my $pos = shift;
49 4   50     9 my $ctx = shift || die "Context expected";
50            
51 4         5 my $i = $pos;
52 4         4 my $argslen = scalar(@$args);
53 4         18 while ($i < $argslen)
54             {
55 6 100       14 if(ref($args->[$i]) eq "Repl::Core::Pair")
56             {
57 2         4 my $pair = $args->[$i];
58 2         8 my $pairname = $pair->getLeft();
59 2         7 my $pairvalue = $pair->getRight();
60            
61 2 50       10 if($pairname eq $self->{PARAMNAME})
62             {
63 2         3 my $type = $self->{TYPESPEC};
64 2         10 return $type->guard($pairvalue);
65             }
66             }
67 4         9 $i = $i + 1;
68             }
69            
70 2 50       9 if($self->{OPTIONAL})
71             {
72 2         4 my $type = $self->{TYPESPEC};
73 2 50       17 return $type->guard($self->{VALUE}) if $self->{VALUE};
74 0         0 return $self->{VALUE};
75             }
76             else
77             {
78 0         0 croak sprintf("Missing named argument '%s'.", $self->{PARAMNAME});
79             }
80             }
81            
82             sub name
83             {
84 2     2 0 4 my $self = shift;
85 2         10 return $self->{PARAMNAME};
86             }
87            
88             1;