diff options
author | Yorhel <git@yorhel.nl> | 2012-02-18 15:46:46 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2012-02-18 15:46:46 +0100 |
commit | 9aa87efa574273d88e9f8e9dc870224659f608c9 (patch) | |
tree | afb74e5a71caf37b0ba347f8ef1b3a3d6caff02c | |
parent | 52aa1ecfa8b4bf8a7217d02e6fb6fbe3801043cb (diff) |
Load AnyEvent::Handle and JSON/JSON::XS modules when needed
-rw-r--r-- | Tanja.pm | 24 |
1 files changed, 14 insertions, 10 deletions
@@ -1,13 +1,10 @@ -# TODO: Split into multiple files? (Or at least don't load AnyEvent::Handle and -# JSON::XS when they aren't needed.) - package Tanja; use strict; use warnings; # Just make sure it's loaded. It doesn't export anything. -use AnyEvent; +use AnyEvent (); # Args: [ pattern ], [ tuple ] @@ -186,8 +183,8 @@ package Tanja::Link; use strict; use warnings; -use AnyEvent::Handle; use Errno 'EPIPE'; +use Carp 'croak'; # Args: Tanja::Server, $server||!$client, AnyEvent::Handle, $error->($message) @@ -196,6 +193,8 @@ use Errno 'EPIPE'; # undef. sub new { my($own, $serv, $init, $handle, $err) = @_; + require AnyEvent::Handle; + croak 'No JSON module available.' if !Tanja::Link::JSON->init; my $s = bless { serv => $serv, hdl => $handle, @@ -327,22 +326,28 @@ sub close { } -# JSON serialization format +# JSON serialization format. Requires either JSON or JSON::XS package Tanja::Link::JSON; use strict; use warnings; -use JSON::XS; my @num_to_cmd = ('', qw|register unregister tuple response close|); my %cmd_to_num = map +($num_to_cmd[$_], $_), keys @num_to_cmd; +my $json; + +sub init { + $json = eval { require JSON::XS; JSON::XS->new->utf8 } + || eval { require JSON; JSON->new->utf8 }; + !!$json; +} sub anyevent_read_type { my $cb = $_[1]; sub { $_[0]{rbuf} =~ s/^([^\012]*)\012// or return; - my $d = eval { decode_json $1; }; + my $d = eval { $json->decode($1); }; return $cb->($_[0], undef) || 1 if !$d || ref($d) ne 'ARRAY'; my $num = shift @$d; return $cb->($_[0], undef) || 1 if !$num || $num !~ /^\d+$/ || $num > @num_to_cmd; @@ -355,11 +360,10 @@ sub anyevent_read_type { sub anyevent_write_type { my(undef, $cmd, @args) = @_; - encode_json([$cmd_to_num{$cmd}, @args])."\012"; + $json->encode([$cmd_to_num{$cmd}, @args])."\012"; } 1; # vim:noet:sw=4:ts=4 - |