package Text::Tradition::Collation::Reading::Lexeme;
use Moose;
+use JSON ();
use Module::Load;
+use Text::Tradition::Collation::Reading::WordForm;
=head1 NAME
'matching_forms' => 'elements',
'matching_form' => 'get',
'add_matching_form' => 'push',
+ },
+ default => sub { [] },
);
has 'is_disambiguated' => (
- is => 'ro',
+ is => 'rw',
isa => 'Bool',
default => undef,
- writer => '_set_disambiguated',
);
has 'form' => (
writer => '_set_form',
);
+around BUILDARGS => sub {
+ my $orig = shift;
+ my $class = shift;
+ my $args = @_ == 1 ? $_[0] : { @_ };
+ if( exists $args->{JSON} ) {
+ my $data = $args->{JSON};
+ if( exists $data->{'form'} && $data->{'form'} ) {
+ my $form = Text::Tradition::Collation::Reading::WordForm->new(
+ 'JSON' => $data->{'form'} );
+ $data->{'form'} = $form;
+ }
+ if( exists $data->{'wordform_matchlist'} && $data->{'wordform_matchlist'} ) {
+ my @ml;
+ foreach my $wfjson ( @{$data->{'wordform_matchlist'}} ) {
+ push( @ml, Text::Tradition::Collation::Reading::WordForm->new(
+ 'JSON' => $wfjson ) );
+ }
+ $data->{'wordform_matchlist'} = \@ml;
+ }
+ $args = $data;
+ }
+ $class->$orig( $args );
+};
+
+# Do auto-disambiguation if we were created with a single wordform
+sub BUILD {
+ my $self = shift;
+
+ if( $self->matches == 1 ) {
+ $self->disambiguate( 0 );
+ }
+}
+
+around 'add_matching_form' => sub {
+ my $orig = shift;
+ my $self = shift;
+ my @realargs;
+ foreach my $a ( @_ ) {
+ if( ref( $a ) ) {
+ push( @realargs, $a );
+ } else {
+ # Make the wordform from the string
+ my $wf = Text::Tradition::Collation::Reading::WordForm->new(
+ 'JSON' => $a );
+ push( @realargs, $wf );
+ }
+ }
+ return $self->$orig( @realargs );
+};
=head2 disambiguate( $index )
throw( "There is no candidate wordform at index $idx" )
unless $form;
$self->_set_form( $form );
- $self->_set_disambiguated( 1 );
+ $self->is_disambiguated( 1 );
}
-=head2 lookup
+=head2 has_form( $rep )
-Uses the module for the declared language to look up the lexeme in the
-language database (if any.) Sets the returned morphological matches in
-matching_forms, and returns the list as an array of WordForm objects.
+Returns the index of the matching form whose string representation is in $rep,
+or else undef if none is found.
=cut
-sub lookup {
- my $self = shift;
- my $lang = $self->language;
- my @answers;
- try {
- my $langmod = "Text::Tradition::Language::$lang";
- load( $langmod );
- @answers = $langmod->can( 'word_lookup' )->( $self->string );
- } catch {
- throw( "No language module for $lang, or the module has no word_lookup functionality" );
+sub has_form {
+ my( $self, $rep ) = @_;
+ my $i = 0;
+ foreach my $mf ( $self->matching_forms ) {
+ my $struct = $mf->TO_JSON;
+ return $i if $struct eq $rep;
+ $i++;
}
- $self->clear_matching_forms;
- $self->add_matching_form( @answers );
- return @answers;
+ return undef;
}
+
+sub TO_JSON {
+ my $self = shift;
+ my $hash = {};
+ # Do the scalar keys
+ map { $hash->{$_} = $self->$_ if defined $self->$_ }
+ qw/ language string is_disambiguated form /;
+ $hash->{'wordform_matchlist'} = [ $self->matching_forms ] if $self->matches;
+ return $hash;
+}
no Moose;
__PACKAGE__->meta->make_immutable;