File Coverage

lib/OODoc/Text/Subroutine.pm
Criterion Covered Total %
statement 15 99 15.1
branch 0 36 0.0
condition n/a
subroutine 5 18 27.7
pod 12 13 92.3
total 32 166 19.2


line stmt bran cond sub pod time code
1             # Copyrights 2003-2013 by [Mark Overmeer].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.00.
5              
6             package OODoc::Text::Subroutine;
7 1     1   1056 use vars '$VERSION';
  1         2  
  1         78  
8             $VERSION = '2.00';
9              
10 1     1   6 use base 'OODoc::Text';
  1         2  
  1         86  
11              
12 1     1   6 use strict;
  1         1  
  1         30  
13 1     1   6 use warnings;
  1         2  
  1         31  
14              
15 1     1   5 use Log::Report 'oodoc';
  1         3  
  1         20  
16              
17              
18             sub init($)
19 0     0 0   { my ($self, $args) = @_;
20              
21 0 0         exists $args->{name}
22             or error __x"no name for subroutine";
23              
24 0 0         $self->SUPER::init($args)
25             or return;
26              
27 0           $self->{OTS_param} = delete $args->{parameters};
28 0           $self->{OTS_options} = {};
29 0           $self->{OTS_defaults} = {};
30 0           $self->{OTS_diags} = [];
31 0           $self;
32             }
33              
34             #-------------------------------------------
35              
36              
37             sub extends($)
38 0     0 1   { my $self = shift;
39 0 0         @_ or return $self->SUPER::extends;
40              
41 0           my $super = shift;
42 0 0         if($self->type ne $super->type)
43 0           { my ($fn1, $ln1) = $self->where;
44 0           my ($fn2, $ln2) = $super->where;
45 0           my ($t1, $t2 ) = ($self->type, $super->type);
46              
47 0           warning __x"subroutine {name}() extended by different type:\n {type1} in {file1} line {line1}\n {type2} in {file2} line {line2}"
48             , name => "$self"
49             , type1 => $t1, file1 => $fn1, line1 => $ln1
50             , type2 => $t2, file2 => $fn2, line2 => $ln2;
51             }
52              
53 0           $self->SUPER::extends($super);
54             }
55              
56             #-------------------------------------------
57              
58              
59 0     0 1   sub parameters() {shift->{OTS_param}}
60              
61             #-------------------------------------------
62              
63              
64             sub location($)
65 0     0 1   { my ($self, $manual) = @_;
66 0           my $container = $self->container;
67 0 0         my $super = $self->extends
68             or return $container;
69              
70 0           my $superloc = $super->location;
71 0           my $superpath = $superloc->path;
72 0           my $mypath = $container->path;
73              
74 0 0         return $container if $superpath eq $mypath;
75            
76 0 0         if(length $superpath < length $mypath)
    0          
77 0 0         { return $container
78             if substr($mypath, 0, length($superpath)+1) eq "$superpath/";
79             }
80             elsif(substr($superpath, 0, length($mypath)+1) eq "$mypath/")
81 0 0         { if($superloc->isa("OODoc::Text::Chapter"))
    0          
82 0           { return $self->manual
83             ->chapter($superloc->name);
84             }
85             elsif($superloc->isa("OODoc::Text::Section"))
86 0           { return $self->manual
87             ->chapter($superloc->chapter->name)
88             ->section($superloc->name);
89             }
90             else
91 0           { return $self->manual
92             ->chapter($superloc->chapter->name)
93             ->section($superloc->section->name)
94             ->subsection($superloc->name);
95             }
96             }
97              
98 0 0         unless($manual->inherited($self))
99 0           { my ($myfn, $myln) = $self->where;
100 0           my ($superfn, $superln) = $super->where;
101              
102 0           warning __x"subroutine {name}() location conflict:\n {path1} in {file1} line {line1}\n {path2} in {file2} line {line2}"
103             , name => "$self"
104             , path1 => $mypath, file1 => $myfn, line1 => $myln
105             , path2 => $superpath, file2 => $superfn, line2 => $superln;
106             }
107              
108 0           $container;
109             }
110              
111              
112 0     0 1   sub path() { shift->container->path }
113              
114             #-------------------------------------------
115              
116              
117             sub default($)
118 0     0 1   { my ($self, $it) = @_;
119 0 0         ref $it
120             or return $self->{OTS_defaults}{$it};
121              
122 0           my $name = $it->name;
123 0           $self->{OTS_defaults}{$name} = $it;
124 0           $it;
125             }
126              
127             #-------------------------------------------
128              
129              
130 0     0 1   sub defaults() { values %{shift->{OTS_defaults}} }
  0            
131              
132              
133             sub option($)
134 0     0 1   { my ($self, $it) = @_;
135 0 0         ref $it
136             or return $self->{OTS_options}{$it};
137              
138 0           my $name = $it->name;
139 0           $self->{OTS_options}{$name} = $it;
140 0           $it;
141             }
142              
143              
144              
145             sub findOption($)
146 0     0 1   { my ($self, $name) = @_;
147 0           my $option = $self->option($name);
148 0 0         return $option if $option;
149              
150 0 0         my $extends = $self->extends or return;
151 0           $extends->findOption($name);
152             }
153              
154              
155 0     0 1   sub options() { values %{shift->{OTS_options}} }
  0            
156              
157              
158             sub diagnostic($)
159 0     0 1   { my ($self, $diag) = @_;
160 0           push @{$self->{OTS_diags}}, $diag;
  0            
161 0           $diag;
162             }
163              
164              
165 0     0 1   sub diagnostics() { @{shift->{OTS_diags}} }
  0            
166              
167              
168             sub collectedOptions(@)
169 0     0 1   { my ($self, %args) = @_;
170 0           my @extends = $self->extends;
171 0           my %options;
172 0           foreach ($self->extends)
173 0           { my $options = $_->collectedOptions;
174 0           @options{ keys %$options } = values %$options;
175             }
176              
177 0           $options{$_->name}[0] = $_ for $self->options;
178              
179 0           foreach my $default ($self->defaults)
180 0           { my $name = $default->name;
181              
182 0 0         unless(exists $options{$name})
183 0           { my ($fn, $ln) = $default->where;
184 0           warning __x"no option {name} for default in {file} line {line}"
185             , name => $name, file => $fn, line => $ln;
186 0           next;
187             }
188 0           $options{$name}[1] = $default;
189             }
190              
191 0           foreach my $option ($self->options)
192 0           { my $name = $option->name;
193 0 0         next if defined $options{$name}[1];
194              
195 0           my ($fn, $ln) = $option->where;
196 0           warning __x"no default for option {name} defined in {file} line {line}"
197             , name => $name, file => $fn, line => $ln;
198              
199 0           my $default = $options{$name}[1] =
200             OODoc::Text::Default->new
201             ( name => $name, value => 'undef'
202             , subroutine => $self, linenr => $ln
203             );
204              
205 0           $self->default($default);
206             }
207              
208 0           \%options;
209             }
210              
211             1;