package Text::Tradition::Collation::Reading;
use Moose;
+use JSON qw/ from_json /;
use Module::Load;
+use Text::Tradition::Error;
use YAML::XS;
use overload '""' => \&_stringify, 'fallback' => 1;
$class->$orig( $args );
};
+# Look for a lexeme-string argument in the build args.
+sub BUILD {
+ my( $self, $args ) = @_;
+ if( exists $args->{'lexemes'} ) {
+ $self->_deserialize_lexemes( $args->{'lexemes'} );
+ }
+}
+
=head2 is_meta
A meta attribute (ha ha), which should be true if any of our 'special'
}
-# For graph serialization. Return a string representation of the associated
+# For graph serialization. Return a JSON representation of the associated
# reading lexemes.
sub _serialize_lexemes {
my $self = shift;
- return Dump( [ $self->lexemes ] );
+ my $json = JSON->new->allow_blessed(1)->convert_blessed(1);
+ return $json->encode( [ $self->lexemes ] );
+}
+
+# Given a JSON representation of the lexemes, instantiate them and add
+# them to the reading.
+sub _deserialize_lexemes {
+ my( $self, $json ) = @_;
+ my $data = from_json( $json );
+ return unless @$data;
+
+ # Need to have the lexeme module in order to have lexemes.
+ eval { use Text::Tradition::Collation::Reading::Lexeme; };
+ throw( $@ ) if $@;
+
+ # Good to go - add the lexemes.
+ my @lexemes;
+ foreach my $lexhash ( @$data ) {
+ push( @lexemes, Text::Tradition::Collation::Reading::Lexeme->new(
+ 'JSON' => $lexhash ) );
+ }
+ $self->clear_lexemes;
+ $self->add_lexeme( @lexemes );
}
-
## Utility methods
return $self->text;
}
-## TODO will need a throw() here
+sub throw {
+ Text::Tradition::Error->throw(
+ 'ident' => 'Reading error',
+ 'message' => $_[0],
+ );
+}
no Moose;
__PACKAGE__->meta->make_immutable;