1 package Text::Tradition::Witness;
3 use Moose::Util::TypeConstraints;
7 Text::Tradition::Witness - a manuscript witness to a text tradition
11 use Text::Tradition::Witness;
12 my $w = Text::Tradition::Witness->new(
14 'identifier' => 'Oxford MS Ex.1932',
19 Text::Tradition::Witness is an object representation of a manuscript
20 witness to a text tradition. A manuscript has a sigil (a short code that
21 represents it in the wider tradition), an identifier (e.g. the library ID),
28 Create a new witness. Options include:
32 =item * sigil - A short code to represent the manuscript. Required.
34 =item * text - An array of strings (words) that contains the text of the
35 manuscript. This should not change after the witness has been instantiated,
36 and the path through the collation should always match it.
38 =item * layertext - An array of strings (words) that contains the layered text,
39 if any, of the manuscript. This should not change after the witness has been
40 instantiated, and the path through the collation should always match it.
42 =item * source - A reference to the text, such as a filename, if it is not
43 given in the 'text' option.
45 =item * identifier - The recognized name of the manuscript, e.g. a library
48 =item * other_info - A freeform string for any other description of the
55 Accessor method for the witness sigil.
59 Accessor method to get and set the text array.
63 Accessor method to get and set the text source.
67 Accessor method for the witness identifier.
71 Accessor method for the general witness description.
75 Boolean method to note whether the witness has layers (e.g. pre-correction
76 readings) in the collation.
80 use_ok( 'Text::Tradition::Witness', "can use module" );
82 my @text = qw( This is a line of text );
83 my $wit = Text::Tradition::Witness->new(
87 is( ref( $wit ), 'Text::Tradition::Witness', 'Created a witness' );
89 is( $wit->sigil, 'A', "Witness has correct sigil" );
90 is( join( ' ', @{$wit->text} ), join( ' ', @text ), "Witness has correct text" );
97 # Sigil. Required identifier for a witness.
104 # Text. This is an array of strings (i.e. word tokens).
105 # TODO Think about how to handle this for the case of pre-prepared
106 # collations, where the tokens are in the graph already.
109 isa => 'ArrayRef[Str]',
110 predicate => 'has_text',
115 isa => 'ArrayRef[Str]',
116 predicate => 'has_layertext',
119 # Source. This is where we read in the witness, if not from a
120 # pre-prepared collation. It is probably a filename.
124 predicate => 'has_source',
127 # Path. This is an array of Reading nodes that can be saved during
128 # initialization, but should be cleared before saving in a DB.
131 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
132 predicate => 'has_path',
133 clearer => 'clear_path',
136 has 'uncorrected_path' => (
138 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
139 clearer => 'clear_uncorrected_path',
142 has 'is_layered' => (
147 # Manuscript name or similar
148 has 'identifier' => (
153 # Any other info we have
154 has 'other_info' => (
159 # If we set an uncorrected path, ever, remember that we did so.
160 around 'uncorrected_path' => sub {
164 $self->is_layered( 1 );
170 if( $self->has_source ) {
171 # Read the file and initialize the text.
173 eval { no warnings; $rc = open( WITNESS, $self->source ); };
174 # If we didn't open a file, assume it is a string.
179 push( @words, split( /\s+/, $_ ) );
182 $self->text( \@words );
183 } # else the text is in the source string, probably
184 # XML, and we are doing nothing with it.
189 __PACKAGE__->meta->make_immutable;
195 =item * Get rid of either text or path, as they are redundant.
197 =item * Re-think the mechanism for pre-correction readings etc.
203 This package is free software and is provided "as is" without express
204 or implied warranty. You can redistribute it and/or modify it under
205 the same terms as Perl itself.
209 Tara L Andrews E<lt>aurum@cpan.orgE<gt>