<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/Mojo/JSON.pm</filename>
    </added>
    <added>
      <filename>rfc3875.txt</filename>
    </added>
    <added>
      <filename>rfc4627.txt</filename>
    </added>
    <added>
      <filename>t/mojo/json.t</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,6 +1,7 @@
 This file documents the revision history for Perl extension Mojo.
 
 0.991252 2009-09-01 00:00:00
+        - Added native JSON support.
         - Fixed a design flaw in Mojo::Server::Daemon and made it about 20
           times faster.
         - Fixed a similar design flaw in Mojo::Client.</diff>
      <filename>Changes</filename>
    </modified>
    <modified>
      <diff>@@ -8,6 +8,7 @@ use warnings;
 use base 'Mojo::Base';
 
 use File::Spec;
+use Mojo::JSON;
 use MojoX::Types;
 
 __PACKAGE__-&gt;attr(default_format =&gt; 'html');
@@ -19,6 +20,26 @@ __PACKAGE__-&gt;attr(types         =&gt; sub { MojoX::Types-&gt;new });
 
 # This is not how Xmas is supposed to be.
 # In my day Xmas was about bringing people together, not blowing them apart.
+sub new {
+    my $self = shift-&gt;SUPER::new(@_);
+
+    # JSON
+    $self-&gt;add_handler(
+        json =&gt; sub {
+            my ($r, $c, $output) = @_;
+            $$output = Mojo::JSON-&gt;new-&gt;encode(delete $c-&gt;stash-&gt;{json});
+        }
+    );
+
+    # Text
+    $self-&gt;add_handler(
+        text =&gt; sub {
+            my ($r, $c, $output) = @_;
+            $$output = delete $c-&gt;stash-&gt;{text};
+        }
+    );
+}
+
 sub add_handler {
     my $self = shift;
 
@@ -54,8 +75,15 @@ sub render {
     my $output;
 
     # Text
-    if (my $text = delete $c-&gt;stash-&gt;{text}) {
-        $output = $text;
+    if ($c-&gt;stash-&gt;{text}) {
+        $self-&gt;handler-&gt;{text}-&gt;($self, $c, \$output);
+        $c-&gt;stash-&gt;{inner_template} = $output if $c-&gt;stash-&gt;{layout};
+    }
+
+    # JSON
+    elsif ($c-&gt;stash-&gt;{json}) {
+        $self-&gt;handler-&gt;{json}-&gt;($self, $c, \$output);
+        $format = 'json';
         $c-&gt;stash-&gt;{inner_template} = $output if $c-&gt;stash-&gt;{layout};
     }
 
@@ -197,6 +225,10 @@ L&lt;MojoX::Types&gt; implements the follwing attributes.
 L&lt;MojoX::Types&gt; inherits all methods from L&lt;Mojo::Base&gt; and implements the
 follwing the ones.
 
+=head2 C&lt;new&gt;
+
+    my $renderer = MojoX::Renderer-&gt;new;
+
 =head2 C&lt;add_handler&gt;
 
     $renderer = $renderer-&gt;add_handler(epl =&gt; sub { ... });</diff>
      <filename>lib/MojoX/Renderer.pm</filename>
    </modified>
    <modified>
      <diff>@@ -49,6 +49,12 @@ sub render {
 
 sub render_inner { delete shift-&gt;stash-&gt;{inner_template} }
 
+sub render_json {
+    my $self = shift;
+    $self-&gt;stash-&gt;{json} = shift;
+    return $self-&gt;render(@_);
+}
+
 sub render_partial {
     my $self = shift;
     local $self-&gt;stash-&gt;{partial} = 1;
@@ -125,6 +131,11 @@ ones.
 
     my $output = $c-&gt;render_inner;
 
+=head2 C&lt;render_json&gt;
+
+    $c-&gt;render_json({foo =&gt; 'bar'});
+    $c-&gt;render_json([1, 2, -3]);
+
 =head2 C&lt;render_partial&gt;
 
     my $output = $c-&gt;render_partial;</diff>
      <filename>lib/Mojolicious/Controller.pm</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ use warnings;
 
 use utf8;
 
-use Test::More tests =&gt; 64;
+use Test::More tests =&gt; 72;
 
 # Wait you're the only friend I have...
 # You really want a robot for a friend?
@@ -16,6 +16,7 @@ use Test::More tests =&gt; 64;
 # so if anyone asks you're my debugger.
 use Mojo::ByteStream 'b';
 use Mojo::Client;
+use Mojo::JSON;
 use Mojo::Transaction::Single;
 use Mojolicious::Lite;
 
@@ -70,6 +71,9 @@ get '/firefox/:stuff' =&gt; (agent =&gt; qr/Firefox/) =&gt; sub {
 # POST /utf8
 post '/utf8' =&gt; 'form';
 
+# GET /json
+get '/json' =&gt; sub { shift-&gt;render_json({foo =&gt; [1, -2, 3, 'bar']}) };
+
 # Oh Fry, I love you more than the moon, and the stars,
 # and the POETIC IMAGE NUMBER 137 NOT FOUND
 my $app    = Mojolicious::Lite-&gt;new;
@@ -209,6 +213,19 @@ is($tx-&gt;res-&gt;body, b(&lt;&lt;EOF)-&gt;encode('utf8')-&gt;to_string);
 &#1042;&#1103;&#1095;&#1077;&#1089;&#1083;&#1072;&#1074; &#1058;&#1080;&#1093;&#1072;&#1085;&#1086;&#1074;&#1089;&#1082;&#1080;&#1081;
 EOF
 
+# GET /json
+$tx = Mojo::Transaction::Single-&gt;new_get('/json');
+$client-&gt;process_app($app, $tx);
+is($tx-&gt;res-&gt;code,                            200);
+is($tx-&gt;res-&gt;headers-&gt;server,                 'Mojo (Perl)');
+is($tx-&gt;res-&gt;headers-&gt;header('X-Powered-By'), 'Mojo (Perl)');
+is($tx-&gt;res-&gt;headers-&gt;content_type,           'application/json');
+my $hash = Mojo::JSON-&gt;new-&gt;decode($tx-&gt;res-&gt;body);
+is($hash-&gt;{foo}-&gt;[0], 1);
+is($hash-&gt;{foo}-&gt;[1], -2);
+is($hash-&gt;{foo}-&gt;[2], 3);
+is($hash-&gt;{foo}-&gt;[3], 'bar');
+
 __DATA__
 @@ index.html.epl
 %= something()</diff>
      <filename>t/mojolicious/lite_app.t</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4f1c085e36b55408d7ff8fd4e6e55668b102aff8</id>
    </parent>
  </parents>
  <author>
    <name>Sebastian Riedel</name>
    <email>sri@odyssey.local</email>
  </author>
  <url>http://github.com/kraih/mojo/commit/2d652536bb8d1b5d3d5de2acdb8023b89b27c421</url>
  <id>2d652536bb8d1b5d3d5de2acdb8023b89b27c421</id>
  <committed-date>2009-09-17T07:44:19-07:00</committed-date>
  <authored-date>2009-09-17T07:44:19-07:00</authored-date>
  <message>added native JSON support</message>
  <tree>bdfdc54d2fb1c6a2c1ed66b4f41894c6f8c74b38</tree>
  <committer>
    <name>Sebastian Riedel</name>
    <email>sri@odyssey.local</email>
  </committer>
</commit>
