summaryrefslogtreecommitdiffstats
path: root/Bugzilla/WebService/JSON.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/WebService/JSON.pm')
-rw-r--r--Bugzilla/WebService/JSON.pm64
1 files changed, 64 insertions, 0 deletions
diff --git a/Bugzilla/WebService/JSON.pm b/Bugzilla/WebService/JSON.pm
new file mode 100644
index 000000000..5c28b20f4
--- /dev/null
+++ b/Bugzilla/WebService/JSON.pm
@@ -0,0 +1,64 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::WebService::JSON;
+use 5.10.1;
+use Moo;
+
+use Bugzilla::Logging;
+use Bugzilla::WebService::JSON::Box;
+use JSON::MaybeXS;
+use Scalar::Util qw(refaddr blessed);
+use Package::Stash;
+
+use constant Box => 'Bugzilla::WebService::JSON::Box';
+
+has 'json' => (
+ init_arg => undef,
+ is => 'lazy',
+ handles => {_encode => 'encode', _decode => 'decode'},
+);
+
+sub encode {
+ my ($self, $value) = @_;
+ return Box->new(json => $self, value => $value);
+}
+
+sub decode {
+ my ($self, $box) = @_;
+
+ if (blessed($box) && $box->isa(Box)) {
+ return $box->value;
+ }
+ else {
+ return $self->_decode($box);
+ }
+}
+
+sub _build_json { JSON::MaybeXS->new }
+
+# delegation all the json options to the real json encoder.
+{
+ my @json_methods = qw(
+ utf8 ascii pretty canonical
+ allow_nonref allow_blessed convert_blessed
+ );
+ my $stash = Package::Stash->new(__PACKAGE__);
+ foreach my $method (@json_methods) {
+ my $symbol = '&' . $method;
+ $stash->add_symbol(
+ $symbol => sub {
+ my $self = shift;
+ $self->json->$method(@_);
+ return $self;
+ }
+ );
+ }
+}
+
+
+1;