all tests now working again
[scpubgit/stemmatology.git] / lib / Text / Tradition / Witness.pm
CommitLineData
dd3b58b0 1package Text::Tradition::Witness;
2use Moose;
7854e12e 3use Moose::Util::TypeConstraints;
dd3b58b0 4
7158714d 5=head1 NAME
6
7Text::Tradition::Witness - a manuscript witness to a text tradition
8
9=head1 SYNOPSIS
10
11 use Text::Tradition::Witness;
12 my $w = Text::Tradition::Witness->new(
13 'sigil' => 'A',
14 'identifier' => 'Oxford MS Ex.1932',
15 );
16
17=head1 DESCRIPTION
18
19Text::Tradition::Witness is an object representation of a manuscript
20witness to a text tradition. A manuscript has a sigil (a short code that
21represents it in the wider tradition), an identifier (e.g. the library ID),
22and probably a text.
23
24=head1 METHODS
25
26=head2 new
27
28Create a new witness. Options include:
29
30=over
31
32=item * sigil - A short code to represent the manuscript. Required.
33
34=item * text - An array of strings (words) that contains the text of the
35manuscript.
36
37=item * source - A reference to the text, such as a filename, if it is not
38given in the 'text' option.
39
40=item * identifier - The recognized name of the manuscript, e.g. a library
41identifier.
42
43=item * other_info - A freeform string for any other description of the
44manuscript.
45
46=back
47
48=head2 sigil
49
50Accessor method for the witness sigil.
51
52=head2 text
53
54Accessor method to get and set the text array.
55
56=head2 source
57
58Accessor method to get and set the text source.
59
60=head2 identifier
61
62Accessor method for the witness identifier.
63
64=head2 other_info
65
66Accessor method for the general witness description.
67
1f7aa795 68=head2 is_layered
7158714d 69
1f7aa795 70Boolean method to note whether the witness has layers (e.g. pre-correction
71readings) in the collation.
7158714d 72
73=begin testing
74
75use_ok( 'Text::Tradition::Witness', "can use module" );
76
77my @text = qw( This is a line of text );
78my $wit = Text::Tradition::Witness->new(
79 'sigil' => 'A',
80 'text' => \@text,
81 );
82is( ref( $wit ), 'Text::Tradition::Witness', 'Created a witness' );
83if( $wit ) {
84 is( $wit->sigil, 'A', "Witness has correct sigil" );
85 is( join( ' ', @{$wit->text} ), join( ' ', @text ), "Witness has correct text" );
86}
87
88=end testing
89
90=cut
91
784877d9 92# Sigil. Required identifier for a witness.
dd3b58b0 93has 'sigil' => (
7158714d 94 is => 'ro',
95 isa => 'Str',
96 required => 1,
97 );
dd3b58b0 98
7158714d 99# Text. This is an array of strings (i.e. word tokens).
d047cd52 100# TODO Think about how to handle this for the case of pre-prepared
101# collations, where the tokens are in the graph already.
dd3b58b0 102has 'text' => (
7158714d 103 is => 'rw',
104 isa => 'ArrayRef[Str]',
105 predicate => 'has_text',
106 );
dd3b58b0 107
d047cd52 108# Source. This is where we read in the witness, if not from a
109# pre-prepared collation. It is probably a filename.
110has 'source' => (
7158714d 111 is => 'ro',
112 isa => 'Str',
113 predicate => 'has_source',
114 );
784877d9 115
1f7aa795 116# Path. This is an array of Reading nodes that can be saved during
117# initialization, but should be cleared before saving in a DB.
4a8828f0 118has 'path' => (
7158714d 119 is => 'rw',
120 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
121 predicate => 'has_path',
1f7aa795 122 clearer => 'clear_path',
7158714d 123 );
4a8828f0 124
b15511bf 125has 'uncorrected_path' => (
7158714d 126 is => 'rw',
127 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
1f7aa795 128 clearer => 'clear_uncorrected_path',
129 );
130
131has 'is_layered' => (
132 is => 'rw',
133 isa => 'Bool',
7158714d 134 );
f6066bac 135
136# Manuscript name or similar
137has 'identifier' => (
7158714d 138 is => 'ro',
139 isa => 'Str',
140 );
f6066bac 141
142# Any other info we have
143has 'other_info' => (
7158714d 144 is => 'ro',
145 isa => 'Str',
146 );
147
1f7aa795 148# If we set an uncorrected path, ever, remember that we did so.
149around 'uncorrected_path' => sub {
150 my $orig = shift;
151 my $self = shift;
152
153 $self->is_layered( 1 );
154 $self->$orig( @_ );
155};
e2902068 156
784877d9 157sub BUILD {
7158714d 158 my $self = shift;
159 if( $self->has_source ) {
160 # Read the file and initialize the text.
161 my $rc;
162 eval { no warnings; $rc = open( WITNESS, $self->source ); };
163 # If we didn't open a file, assume it is a string.
164 if( $rc ) {
165 my @words;
166 while(<WITNESS>) {
167 chomp;
168 push( @words, split( /\s+/, $_ ) );
169 }
170 close WITNESS;
171 $self->text( \@words );
172 } # else the text is in the source string, probably
173 # XML, and we are doing nothing with it.
174 }
175}
176
dd3b58b0 177no Moose;
178__PACKAGE__->meta->make_immutable;
7158714d 179
180=head1 BUGS / TODO
181
182=over
183
184=item * Get rid of either text or path, as they are redundant.
185
186=item * Re-think the mechanism for pre-correction readings etc.
187
188=back
189
190=head1 LICENSE
191
192This package is free software and is provided "as is" without express
193or implied warranty. You can redistribute it and/or modify it under
194the same terms as Perl itself.
195
196=head1 AUTHOR
197
198Tara L Andrews E<lt>aurum@cpan.orgE<gt>