break out punctuation from the rest of the reading text
[scpubgit/stemmatology.git] / lib / Text / Tradition / Collation / Relationship.pm
index c2ad3ae..f539601 100644 (file)
@@ -2,91 +2,74 @@ package Text::Tradition::Collation::Relationship;
 
 use Moose;
 use Moose::Util::TypeConstraints;
-## CAREFUL in our use of Moose::Util::TypeConstraints.  That 'from'
-## clashes with Graph::Easy::Edge 'from', so we'll need to unimport
-## TypeConstraints after defining the types.  Or else we would have to
-## finally split out our types into another module.
-use MooseX::NonMoose;
-
-extends 'Graph::Easy::Edge';
-
-enum 'RelationshipType' => qw( spelling orthographic grammatical repetition lexical );
-
-subtype 'RelationshipVector',
-    => as 'ArrayRef',
-    => where { @$_ == 2
-              && $_->[0]->isa( 'Graph::Easy::Node' )
-              && $_->[1]->isa( 'Graph::Easy::Node' )
-            },
-    message { 'Argument should be [ SourceReading, TargetReading ]' };
-
-subtype 'RelationshipTokenVector',
-    => as 'ArrayRef',
-    => where { @$_ == 2 },
-    message { 'Argument should be [ \'source\', \'target\' ]' };
-
-no Moose::Util::TypeConstraints;  ## see comment above
-                  
+
+enum 'RelationshipType' => qw( spelling orthographic grammatical meaning lexical
+                                                          collation repetition transposition );
+
+enum 'RelationshipScope' => qw( local tradition global );
+
+no Moose::Util::TypeConstraints;
+
+=over 4
+
+=item * type - Can be one of spelling, orthographic, grammatical, meaning, lexical, collated, repetition, transposition.  All but the last two are only valid relationships between readings that occur at the same point in the text.
+
+=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.
+
+=item * scope - (Optional) A meta-attribute.  Can be one of 'local', 'tradition', or 'global'. Denotes whether the relationship between the two readings holds always, independent of context, either within this tradition or across all traditions.
+
+=back
+
+=cut
+
 has 'type' => (
-    is => 'rw',
-    isa => 'RelationshipType',
-    required => 1,
-);
-
-has 'this_relation' => (
-    is => 'rw',
-    isa => 'RelationshipVector',
-    required => 1,
-);
-
-has 'primary_relation' => (
-    is => 'rw',
-    isa => 'RelationshipTokenVector',
-);
-
-has 'global' => (
-    is => 'rw',
-    isa => 'Bool',
-    default => 0,
-);
+       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 'scope' => (
+       is => 'ro',
+       isa => 'RelationshipScope', 
+       default => 'local',
+       );
 
 has 'non_correctable' => (
-    is => 'rw',
-    isa => 'Bool',
-    );
+       is => 'ro',
+       isa => 'Bool',
+       );
 
 has 'non_independent' => (
-    is => 'rw',
-    isa => 'Bool',
-    );
-    
-has 'equal_rank' => (
-    is => 'rw',
-    isa => 'Bool',
-    );
-
-sub FOREIGNBUILDARGS {
-    my $class = shift;
-    my %args = @_;
-
-    # Make the label match our 'type' attribute.
-    my @superclass_args;
-    if( exists $args{'type'} ) {
-       push( @superclass_args, 'label', $args{'type'} );
-    }
-    return @superclass_args;
+       is => 'ro',
+       isa => 'Bool',
+       );
+
+# A read-only meta-Boolean attribute.
+sub colocated {
+       my $self = shift;
+       return $self->type !~ /^(repetition|transposition)$/;
 }
 
-sub BUILD {
-    my( $self, $args ) = @_;
-
-    $self->set_attribute( 'class', 'relationship' );
-
-    unless( $self->primary_relation ) {
-       $self->primary_relation( [ $self->this_relation->[0]->label,
-                                  $self->this_relation->[1]->label ] );
-    }
+sub nonlocal {
+       my $self = shift;
+       return $self->scope ne 'local';
 }
 
 no Moose;
 __PACKAGE__->meta->make_immutable;
+
+1;