6 has channel => (is => 'ro', required => 1);
8 has local_request_handlers => (is => 'ro', default => sub { {} });
10 has requests_received => (is => 'ro', default => sub { {} });
12 has last_serial => (is => 'ro',default => sub { 'A0000' });
14 sub next_serial { ++($_[0]->{last_serial}) }
16 has requests_sent => (is => 'ro', default => sub { {} });
18 sub run { shift->run_until }
21 my ($self, $done) = @_;
22 while (!$_[1] and my $message = $self->channel->receive) {
23 $self->receive(@$message);
28 my ($self, $type, @payload) = @_;
30 $self->channel->send(MISTAKE => message_format => "No message type");
34 $self->channel->send(MISTAKE => message_format => "Tag missing");
37 unless (@payload > 1) {
38 $self->channel->send(MISTAKE => message_format => "No payload");
40 if ($type eq 'REQUEST') {
41 $self->receive_request(@payload);
44 if ($type eq 'RESPONSE') {
45 $self->receive_response(@payload);
51 my ($self, $tag, $handler_name, @payload) = @_;
52 if ($self->requests_received->{$tag}) {
54 MISTAKE => request_tag => "Request for ${tag} in process"
58 my $handler = $self->local_request_handlers->{$handler_name};
61 $tag => MISTAKE => handler_name => "No such handler ${handler_name}"
66 = $self->requests_received->{$tag}
68 tag => $tag, respond_to => $self
70 $handler->start_request($request => @payload);
74 my ($self, $tag, @result) = @_;
75 delete $self->requests_received->{$tag};
76 $self->channel->send(RESPONSE => $tag => @result);
80 my ($self, $respond_to, @payload) = @_;
81 my $tag = $self->next_serial;
83 = $self->requests_sent->{$tag}
86 respond_to => $respond_to
88 $self->channel->send(REQUEST => $tag => @payload);
92 sub receive_response {
93 my ($self, $tag, @result) = @_;
94 my $request = delete $self->requests_sent->{$tag};
95 $request->respond(@result);