package Text::Tradition::Collation::Reading::WordForm;
+use Lingua::Features::Structure;
+use JSON ();
use Moose;
=head1 NAME
has 'morphology' => (
is => 'ro',
- isa => 'ArrayRef',
+ isa => 'Lingua::Features::Structure',
required => 1,
);
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
- my %args = @_ == 1 ? %{$_[0]} : @_;
- unless( ref( $args{'morphology'} ) ) {
- my @morph = split( '', $args{'morphology'} );
- $args{'morphology'} = \@morph;
+ my $args = @_ == 1 ? $_[0] : { @_ };
+ if( exists $args->{'JSON'} ) {
+ $DB::single = 1;
+ my @data = split( / \/\/ /, $args->{'JSON'} );
+ print STDERR "Attempting to parse " . $data[2] . " into structure";
+ my $morph = Lingua::Features::Structure->from_string( $data[2] );
+ $args = { 'language' => $data[0], 'lemma' => $data[1],
+ 'morphology' => $morph };
}
- $class->$orig( %args );
+ $class->$orig( $args );
};
+
+=head2 to_string
+
+Returns a string combination of language/lemma/morphology that can be used
+in equivalence testing.
+
+=cut
-sub _stringify {
+sub to_string {
my $self = shift;
- return sprintf( "%s//%s//%s", $self->language, $self->lemma,
- join( '', $self->morphology ) );
+ return JSON->new->convert_blessed(1)->encode( $self );
}
+# Rather than spitting it out as a JSON hash, encode it as a string so that
+# the XML serialization doesn't become insane.
+sub TO_JSON {
+ my $self = shift;
+ return sprintf( "%s // %s // %s", $self->language, $self->lemma,
+ $self->morphology->to_string() );
+}
+
no Moose;
__PACKAGE__->meta->make_immutable;