File Coverage

blib/lib/Gedcom/Individual.pm
Criterion Covered Total %
statement 107 184 58.1
branch 23 80 28.7
condition 5 9 55.5
subroutine 23 33 69.7
pod 8 30 26.6
total 166 336 49.4


line stmt bran cond sub pod time code
1             # Copyright 1999-2013, Paul Johnson (paul@pjcj.net)
2              
3             # This software is free. It is licensed under the same terms as Perl itself.
4              
5             # The latest version of this software should be available from my homepage:
6             # http://www.pjcj.net
7              
8             # documentation at __END__
9              
10 11     11   56 use strict;
  11         19  
  11         406  
11              
12             require 5.005;
13              
14             package Gedcom::Individual;
15              
16 11     11   3845 use Gedcom::Record 1.20;
  11         159  
  11         318  
17              
18 11     11   56 use vars qw($VERSION @ISA);
  11         21  
  11         17992  
19             $VERSION = "1.20";
20             @ISA = qw( Gedcom::Record );
21              
22             sub name {
23 4620     4620 1 5893 my $self = shift;
24 4620         7809 my $name = $self->tag_value("NAME");
25 4620 50       7853 return "" unless defined $name;
26 4620         17813 $name =~ s/\s+/ /g;
27 4620         23501 $name =~ s| ?/ ?(.*?) ?/ ?| /$1/ |;
28 4620         8785 $name =~ s/^\s+//g;
29 4620         12134 $name =~ s/\s+$//g;
30 4620         16763 $name
31             }
32              
33             sub cased_name {
34 0     0 1 0 my $self = shift;
35 0         0 my $name = $self->name;
36 0         0 $name =~ s|/([^/]*)/?|uc $1|e;
  0         0  
37 0         0 $name
38             }
39              
40             sub surname {
41 4464     4464 1 5207 my $self = shift;
42 4464         6272 my ($surname) = $self->name =~ m|/([^/]*)/?|;
43 4464 100       18608 $surname || ""
44             }
45              
46             sub given_names {
47 0     0 1 0 my $self = shift;
48 0         0 my $name = $self->name;
49 0         0 $name =~ s|/([^/]*)/?| |;
50 0         0 $name =~ s|^\s+||;
51 0         0 $name =~ s|\s+$||;
52 0         0 $name =~ s|\s+| |g;
53 0         0 $name
54             }
55              
56 4464     4464 1 5608 sub soundex { my $self = shift;
57 4464 50       7742 unless ($INC{"Text/Soundex.pm"}) {
58 0         0 warn "Text::Soundex.pm is required to use soundex()";
59             return undef
60 0         0 }
61 4464         6822 Gedcom::soundex($self->surname)
62             }
63              
64             sub sex {
65 0     0 1 0 my $self = shift;
66 0         0 my $sex = $self->tag_value("SEX");
67 0 0       0 defined $sex
    0          
    0          
68             ? $sex =~ /^F/i ? "F" : $sex =~ /^M/i ? "M" : "U"
69             : "U"
70             }
71              
72             sub father {
73 1337     1337 0 6622 my $self = shift;
74 1337         2118 my @a = map { $_->husband } $self->famc;
  1020         2020  
75 1337 50       2904 wantarray ? @a : $a[0]
76             }
77              
78             sub mother {
79 1337     1337 0 5435 my $self = shift;
80 1337         1990 my @a = map { $_->wife } $self->famc;
  1020         1913  
81 1337 50       3238 wantarray ? @a : $a[0]
82             }
83              
84             sub parents {
85 1313     1313 0 5433 my $self = shift;
86 1313         2104 ($self->father, $self->mother)
87             }
88              
89             sub husband {
90 1169     1169 0 5145 my $self = shift;
91 708         1801 my @a = grep { $_->{xref} ne $self->{xref} }
92 1169         1828 map { $_->husband } $self->fams;
  768         1585  
93 1169 50       2664 wantarray ? @a : $a[0]
94             }
95              
96             sub wife {
97 1169     1169 0 5080 my $self = shift;
98 756         1895 my @a = grep { $_->{xref} ne $self->{xref} }
99 1169         1822 map { $_->wife } $self->fams;
  768         1415  
100 1169 50       2139 wantarray ? @a : $a[0]
101             }
102              
103             sub spouse {
104 1145     1145 0 5409 my $self = shift;
105 1145         2679 my @a = ($self->husband, $self->wife);
106 1145 50       2312 wantarray ? @a : $a[0]
107             }
108              
109             sub siblings {
110 1193     1193 0 5215 my $self = shift;
111 2148         4526 my @a = grep { $_->{xref} ne $self->{xref} }
112 1193         1907 map { $_->children } $self->famc;
  876         1703  
113 1193 50       3090 wantarray ? @a : $a[0]
114             }
115              
116             sub half_siblings {
117 0     0 0 0 my $self = shift;
118             my @all_siblings_multiple =
119 0         0 map { $_->children } map { $_->fams } $self->parents;
  0         0  
  0         0  
120 0         0 my @excludelist = ($self, $self->siblings);
121             my @a = grep {
122 0         0 my $cur = $_;
  0         0  
123 0         0 my $half_sibling = 1;
124 0         0 for my $test (@excludelist) {
125 0 0       0 if ($cur->{xref} eq $test->{xref} ) {
126 0         0 $half_sibling = 0;
127 0         0 last;
128             }
129             }
130 0 0       0 push @excludelist, $cur if $half_sibling; # to avoid multiple output
131 0         0 $half_sibling;
132             } @all_siblings_multiple;
133 0 0       0 wantarray ? @a : $a[0]
134             }
135              
136             sub older_siblings {
137 0     0 0 0 my $self = shift;
138 0         0 my @a = map { $_->children } $self->famc;
  0         0  
139 0         0 my $i;
140 0         0 for ($i = 0; $i <= $#a; $i++) {
141             last if $a[$i]->{xref} eq $self->{xref}
142 0 0       0 }
143 0         0 splice @a, $i;
144 0 0       0 wantarray ? @a : $a[-1]
145             }
146              
147             sub younger_siblings {
148 0     0 0 0 my $self = shift;
149 0         0 my @a = map { $_->children } $self->famc;
  0         0  
150 0         0 my $i;
151 0         0 for ($i = 0; $i <= $#a; $i++) {
152             last if $a[$i]->{xref} eq $self->{xref}
153 0 0       0 }
154 0         0 splice @a, 0, $i + 1;
155 0 0       0 wantarray ? @a : $a[0]
156             }
157              
158             sub brothers {
159 24     24 0 5627 my $self = shift;
160 24         114 my @a = grep { $_->tag_value("SEX") !~ /^F/i } $self->siblings;
  24         70  
161 24 50       107 wantarray ? @a : $a[0]
162             }
163              
164             sub half_brothers {
165 0     0 0 0 my $self = shift;
166 0         0 my @a = grep { $_->tag_value("SEX") !~ /^F/i } $self->half_siblings;
  0         0  
167 0 0       0 wantarray ? @a : $a[0]
168             }
169              
170             sub sisters {
171 24     24 0 3720 my $self = shift;
172 24         77 my @a = grep { $_->tag_value("SEX") !~ /^M/i } $self->siblings;
  24         84  
173 24 50       117 wantarray ? @a : $a[0]
174             }
175              
176             sub half_sisters {
177 0     0 0 0 my $self = shift;
178 0         0 my @a = grep { $_->tag_value("SEX") !~ /^M/i } $self->half_siblings;
  0         0  
179 0 0       0 wantarray ? @a : $a[0]
180             }
181              
182             sub children {
183 1457     1457 0 5768 my $self = shift;
184 1457         2195 my @a = map { $_->children } $self->fams;
  888         1696  
185 1457 50       3112 wantarray ? @a : $a[0]
186             }
187              
188             sub sons {
189 24     24 0 3682 my $self = shift;
190 24         88 my @a = grep { $_->tag_value("SEX") !~ /^F/i } $self->children;
  96         209  
191 24 50       113 wantarray ? @a : $a[0]
192             }
193              
194             sub daughters {
195 24     24 0 4220 my $self = shift;
196 24         75 my @a = grep { $_->tag_value("SEX") !~ /^M/i } $self->children;
  96         222  
197 24 50       120 wantarray ? @a : $a[0]
198             }
199              
200             sub descendents {
201 24     24 0 4053 my $self = shift;
202 24         51 my @d;
203 24         69 my @c = $self->children;
204 24         79 while (@c) {
205 48         103 push @d, @c;
206 48         85 @c = map { $_->children } @c;
  240         404  
207             }
208             @d
209 24         111 }
210              
211             sub ancestors {
212 24     24 0 4703 my $self = shift;
213 24         49 my @d;
214 24         88 my @c = $self->parents;
215 24         79 while (@c) {
216 72         139 push @d, @c;
217 72         123 @c = map { $_->parents } @c;
  144         278  
218             }
219             @d
220 24         151 }
221              
222             sub delete {
223 1     1 1 2 my $self = shift;
224 1         2 my $xref = $self->{xref};
225 1         2 my $ret = 1;
226 1         4 for my $f ([ "(HUSB|WIFE)", [$self->fams] ], [ "CHIL", [$self->famc] ]) {
227 2         2 for my $fam (@{$f->[1]}) {
  2         5  
228             # print "deleting from $fam->{xref}\n";
229 1         4 for my $record (@{$fam->_items}) {
  1         3  
230             # print "looking at $record->{tag} $record->{value}\n";
231 3 100 100     47 if (($record->{tag} =~ /$f->[0]/) &&
232             $self->resolve($record->{value})->{xref} eq $xref) {
233 1 50       6 $ret = 0 unless $fam->delete_record($record);
234             }
235             }
236 1 0 33     4 $self->{gedcom}{record}->delete_record($fam)
      33        
237             unless $fam->tag_value("HUSB") ||
238             $fam->tag_value("WIFE") ||
239             $fam->tag_value("CHIL");
240             # TODO - write Family::delete ?
241             # - delete associated notes?
242             }
243             }
244 1 50       4 $ret = 0 unless $self->{gedcom}{record}->delete_record($self);
245 1 50       3 $_[0] = undef if $ret; # Can't reuse a deleted person
246 1         4 $ret
247             }
248              
249             sub print {
250 0     0 1 0 my $self = shift;
251 0 0       0 $self->_items if shift;
252 0         0 $self->SUPER::print; $_->print for @{$self->{items}};
  0         0  
  0         0  
253             # print "fams:\n"; $_->print for $self->fams;
254             # print "famc:\n"; $_->print for $self->famc;
255             }
256              
257             sub print_generations {
258 0     0 0 0 my $self = shift;
259 0         0 my ($generations, $indent) = @_;
260 0 0       0 $generations = 0 unless $generations;
261 0 0       0 $indent = 0 unless $indent;
262 0 0       0 return unless $generations > 0;
263 0         0 my $i = " " x $indent;
264 0 0       0 print "$i$self->{xref} (", $self->rin, ") ", $self->name, "\n"
265             unless $indent;
266 0         0 $self->print;
267 0         0 for my $fam ($self->fams) {
268             # $fam->print;
269 0         0 for my $spouse ($fam->parents) {
270 0 0       0 next unless $spouse;
271             # print "[$spouse]\n";
272 0 0       0 next if $self->xref eq $spouse->xref;
273 0         0 print "$i= $spouse->{xref} (", $spouse->rin, ") ",
274             $spouse->name, "\n";
275             }
276 0         0 for my $child ($fam->children) {
277 0         0 print "$i> $child->{xref} (", $child->rin, ") ",
278             $child->name, "\n";
279 0         0 $child->print_generations($generations - 1, $indent + 1);
280             }
281             }
282             }
283              
284             sub famc {
285 4995     4995 0 5795 my $self = shift;
286 4995         8350 my @a = $self->resolve($self->tag_value("FAMC"));
287 4995 100       9368 wantarray ? @a : $a[0]
288             }
289              
290             sub fams {
291 4917     4917 0 5704 my $self = shift;
292 4917         8092 my @a = $self->resolve($self->tag_value("FAMS"));
293 4917 50       8924 wantarray ? @a : $a[0]
294             }
295              
296             1;
297              
298             __END__