+ my $sock = $self->{sock} || confess("Not connected to any server");
+ my $enc = $self->{encoding};
+ my $deb = $self->{debug};
+
+ my $command = $AUTOLOAD;
+ $command =~ s/.*://;
+
+ $self->__send_command($command, @_);
+
+ my $result = <$sock> || confess("Can't read socket: $!");
+ my $type = substr($result,0,1);
+ $result = substr($result,1,-2);
+
+ $result = decode($enc, $result) if $enc;
+ warn "[RECV] '$type$result'" if $deb;
+
+ if ( $command eq 'info' ) {
+ my $hash;
+ foreach my $l ( split(/\r\n/, $self->__read_bulk($result) ) ) {
+ my ($n,$v) = split(/:/, $l, 2);
+ $hash->{$n} = $v;
+ }
+ return $hash;
+ } elsif ( $command eq 'keys' ) {
+ return $self->__read_multi_bulk($result)
+ if $type eq '*';
+ my $keys = $self->__read_bulk($result);
+ return split(/\s/, $keys) if $keys;
+ return;
+ }
+
+ if ( $type eq '-' ) {
+ confess "[$command] $result";
+ } elsif ( $type eq '+' ) {
+ return $result;
+ } elsif ( $type eq '$' ) {
+ return $self->__read_bulk($result);
+ } elsif ( $type eq '*' ) {
+ return $self->__read_multi_bulk($result);
+ } elsif ( $type eq ':' ) {
+ return $result; # FIXME check if int?
+ } else {
+ confess "unknown type: $type", $self->__read_line();
+ }