stemmaweb bugfixes and style fixes; add 'punctuation' relationship type
[scpubgit/stemmatology.git] / lib / Text / Tradition / Collation / Relationship.pm
index 85f872d..227bb7b 100644 (file)
@@ -3,25 +3,174 @@ package Text::Tradition::Collation::Relationship;
 use Moose;
 use Moose::Util::TypeConstraints;
 
-enum 'RelationshipType' => qw( spelling orthographic grammatical );
-
-has 'sort' => (
-    is => 'rw',
-    isa => 'RelationshipType',
-    required => 1,
-);
-
-has 'reading' => (
-    is => 'rw',
-    isa => 'Text::Tradition::Collation::Reading',
-    required => 1,
-);
-
-has 'global' => (
-    is => 'rw',
-    isa => 'Bool',
-    default => 1,
-);
-
- no Moose;
-  __PACKAGE__->meta->make_immutable;
+enum 'RelationshipType' => qw( spelling orthographic grammatical lexical
+                                                          collated repetition transposition punctuation );
+
+enum 'RelationshipScope' => qw( local document global );
+
+no Moose::Util::TypeConstraints;
+
+=head1 NAME
+
+Text::Tradition::Collation::Relationship - represents a syntactic or semantic
+relationship between two readings
+    
+=head1 DESCRIPTION
+
+Text::Tradition is a library for representation and analysis of collated
+texts, particularly medieval ones.  A relationship connects two readings
+within a collation, usually when they appear in the same place in different
+texts.
+
+=head1 CONSTRUCTOR
+
+=head2 new
+
+Creates a new relationship. Usually called via $collation->add_relationship.
+Options include:
+
+=over 4
+
+=item * type - Can be one of spelling, orthographic, grammatical, lexical, 
+collated, repetition, transposition.  All but the last two are only valid 
+relationships between readings that occur at the same point in the text. 
+The 'collated' relationship should only be used by parsers to align readings 
+in the graph when the input information would otherwise be lost, e.g. from
+an alignment table.
+
+=item * displayform - (Optional) The reading that should be displayed if the 
+related nodes are treated as one.
+
+=item * scope - (Optional) A meta-attribute.  Can be one of 'local', 
+'document', or 'global'. Denotes whether the relationship between the two 
+readings holds always, independent of context, either within this tradition 
+or across all traditions.
+
+=item * annotation - (Optional) A freeform note to attach to the relationship.
+
+=item * alters_meaning - Indicate whether, in context, the related words cause
+the text to have different meanings. Possible values are 0 (no), 1 (slightly),
+and >1 (yes).
+
+=item * non_correctable - (Optional) True if the reading would not have been 
+corrected independently.
+
+=item * non_independent - (Optional) True if the variant is unlikely to have 
+occurred independently in unrelated witnesses.
+
+=back
+
+=head1 ACCESSORS
+
+=head2 type
+
+=head2 displayform
+
+=head2 scope
+
+=head2 annotation
+
+=head2 non_correctable
+
+=head2 non_independent
+
+See the option descriptions above.
+
+=cut
+
+has 'type' => (
+       is => 'ro',
+       isa => 'RelationshipType',
+       required => 1,
+       );
+
+has 'reading_a' => (
+       is => 'ro',
+       isa => 'Str',
+       required => 1,
+       );
+
+has 'reading_b' => (
+       is => 'ro',
+       isa => 'Str',
+       required => 1,
+       );
+
+has 'displayform' => (
+       is => 'ro',
+       isa => 'Str',
+       predicate => 'has_displayform',
+       );
+
+has 'scope' => (
+       is => 'ro',
+       isa => 'RelationshipScope', 
+       default => 'local',
+       );
+       
+has 'annotation' => (
+       is => 'ro',
+       isa => 'Str',
+       predicate => 'has_annotation',
+       );
+       
+has 'alters_meaning' => (
+       is => 'rw',
+       isa => 'Int',
+       default => 0,
+       );
+
+has 'non_correctable' => (
+       is => 'ro',
+       isa => 'Bool',
+       );
+
+has 'non_independent' => (
+       is => 'ro',
+       isa => 'Bool',
+       );
+       
+around 'alters_meaning' => sub {
+       my $orig = shift;
+       my $self = shift;
+       if( @_ ) {
+               if( $_[0] eq 'no' ) {
+                       return $self->$orig( 0 );
+               } elsif( $_[0] eq 'slightly' ) {
+                       return $self->$orig( 1 );
+               } elsif( $_[0] eq 'yes' ) {
+                       return $self->$orig( 2 );
+               } 
+       }
+       return $self->$orig( @_ );
+};             
+       
+# A read-only meta-Boolean attribute.
+
+=head2 colocated
+
+Returns true if the relationship type is one that requires that its readings
+occupy the same place in the collation.
+
+=cut
+
+sub colocated {
+       my $self = shift;
+       return $self->type !~ /^(repetition|transposition)$/;
+}
+
+=head2 nonlocal
+
+Returns true if the relationship scope is anything other than 'local'.
+
+=cut
+
+sub nonlocal {
+       my $self = shift;
+       return $self->scope ne 'local';
+}
+
+no Moose;
+__PACKAGE__->meta->make_immutable;
+
+1;