The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use Mojolicious::Lite;

# Default for config file tests
app->defaults(secret => 'Insecure!');

# Helpers sharing the same name in different embedded applications
helper same_name => sub {'myapp'};

# Load plugin
plugin 'Config';

# Message condition
app->routes->add_condition(
  message => sub {
    my ($route, $c, $captures, $msg) = @_;
    $c->res->headers->header('X-Message' => $msg);
    return 1;
  }
);

get '/' => 'index';

get '/echo' => sub {
  my $c = shift;
  $c->render(text => 'echo: ' . ($c->stash('message') || 'nothing!'));
};

get '/stream' => sub {
  shift->write_chunk(
    'he' => sub {
      shift->write_chunk('ll' => sub { shift->finish('o!') });
    }
  );
};

get '/url/☃' => sub {
  my $c     = shift;
  my $route = $c->url_for({format => 'json'});
  my $rel   = $c->url_for('/☃/stream');
  $c->render(text => "$route -> $rel!");
};

get '/host' => (message => 'it works!') => sub {
  my $c = shift;
  $c->render(text => $c->url_for->base->host);
};

get '/one' => sub { shift->render(text => 'One') };

get '/one/two' => {text => 'Two'};

get '/template/:template';

websocket '/url_for' => sub {
  my $c = shift;
  $c->on(
    message => sub {
      my ($c, $msg) = @_;
      $c->send($c->url_for($msg)->to_abs);
    }
  );
} => 'ws_test';

app->start;
__DATA__

@@ menubar.html.ep
%= same_name
<%= $config->{just} %><%= $config->{one} %><%= $config->{two} %>