Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

use v5.10.0;
use Moose;
use Carp;
# ABSTRACT: Raw, low-level access to Exobrain packets
our $VERSION = '1.08'; # VERSION
my $json = JSON::Any->new;
# Summary declared early, so our role can see it.
has 'summary' => ( is => 'ro', isa => 'Str', required => 1 );
has '_data' => ( is => 'rw', isa => 'Ref' );
has 'namespace' => ( is => 'ro', isa => 'Str', required => 1 );
# Stash our explicit data section
sub BUILD {
my ($self, $args) = @_;
my $data = $args->{data} or croak "Raw packets need a data argument";
$self->_data($data);
return;
};
method data() {
return $self->_data;
}
# Build a typed message from our raw message
method to_class($class) {
my $exobrain = $self->exobrain
or croak "Can't use to_class() on a message without an exobrain object.";
my $msg = $exobrain->message_class($class,
%{ $self->data },
summary => $self->summary,
timestamp => $self->timestamp,
raw => $self->raw,
namespace => $self->namespace,
source => $self->source,
nosend => 1, # Without this, we packet-storm!
# We can leave roles out, because it will auto-calculate
);
}
around BUILDARGS => sub {
my ($orig, $class, @args) = @_;
# If called with an arrayref, then we're reconstituting a packet
# off the wire. We need to make sure we build this with the 'nosend'
# flag set, otherwise we'll result in a packet-storm!
if (@args == 1 and ref($args[0]) eq 'ARRAY') {
my $frames = $args[0];
my (undef, $namespace, $source) = split(/_/, $frames->[0]);
my $metadata = $json->decode( $frames->[1] );
return $class->$orig(
namespace => $namespace,
source => $source,
timestamp => $metadata->{timestamp},
roles => $metadata->{roles},
summary => $frames->[2],
data => $json->decode( $frames->[3] ),
raw => $json->decode( $frames->[4] ),
nosend => 1,
);
}
return $class->$orig(@args);
};
1;
__END__
=pod
=head1 NAME
Exobrain::Message::Raw - Raw, low-level access to Exobrain packets
=head1 VERSION
version 1.08
=head1 DESCRIPTION
This class provides low level access to exobrain packets.
You probably want to use the C<intent>, C<measure>,
C<notify> or other methods in L<Exobrain> rather than using
this directly.
=for Pod::Coverage BUILD
=head1 AUTHOR
Paul Fenwick <pjf@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Paul Fenwick.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut