package Yeb;
our $AUTHORITY = 'cpan:GETTY';
# ABSTRACT: A simple structure for Web::Simple applications
$Yeb::VERSION = '0.104';
use strict;
use warnings;

use Yeb::Application;

sub import { shift;
  my ( $caller ) = caller;
    class => $caller,
    @_ ? ( args => [@_] ) : (),




=head1 NAME

Yeb - A simple structure for Web::Simple applications

=head1 VERSION

version 0.104


  package MyApp::Web;
  use Yeb qw( Session JSON );

  r "/" => sub {
    session test => pa('test');
    text "root";

  r "/blub" => sub {
    text "blub";

  r "/test/..." => sub {
    st stash_var => 1;
    chain 'Test';

  r "/blog/..." => sub {
    chain '+SomeOther::YebApp';


  package MyApp::Web::Test;
  use MyApp::Web;

  r "/json" => sub {
    json {
      test => session('test'),
      stash_var => st('stash_var'),

  r "/" => sub {
    text " test = ".session('test')." and blub is ".st('stash_var');


Can then be started like (see L<Web::Simple>):

  plackup -Ilib -MMyApp::Web -e'MyApp::Web->run_if_script'

or use the B<yeb> CLI tool which automatically also loads up B<./lib> as path
for easy handling:

  yeb MyApp::Web

You can also add additional parameter B<after> the class name:

  yeb MyApp::Web -Imore/lib

Additional parameters get dispatched towards L<plackup>

Bigger L<Text::Xslate> example:

  package MyApp::WebXslate;

  use Yeb Session => JSON => 'Xslate';

  # because of the root() usage we need to use plugin function call
  plugin Static => { default_root => root('htdocs') };

  xslate_path root('templates');

  static qr{^/};
  static_404 qr{^/images/}, root('htdocs_images');

  r "/" => sub {
    st page => 'root';
    xslate 'index';

  r "/test" => sub {
    st page => 'test';
    xslate 'index/test', { extra_var => 'extra' };



You need to install L<Task::Yeb> to get all the plugin functionalities. L<Yeb>
itself is bare.

=encoding utf8


B<WARNING:> I don't advice using it without staying in contact with me
(B<Getty>) at B<#sycontent> on B<>. While the core API will stay
stable, the way how to extend the system will change with the time.

=head1 PLUGINS

For an example on how to make a simple plugin, which adds a new function and
uses a L<Plack::Middleware>, please see the source of L<Yeb::Plugin::Session>.


=head2 yeb

Gives back the L<Yeb::Application> of the web application

=head2 chain

Return another class dispatcher chain, will be prepend with your main class
name, this can be deactivated by using a B<+> in front of the class name.

=head2 cfg

Access to the configuration hash

=head2 cc

Getting the current L<Yeb::Context> of the request

=head2 env

Getting the Plack environment

=head2 req

Getting the current L<Plack::Request>

=head2 root

Current directory or B<YEB_ROOT> environment variable

=head2 cur

Current directory in the moment of start

=head2 plugin $yeb_plugin_name, { key => $value };

=head2 st

Access to the stash hash

=head2 pa

Access to the request parameters, gives back "" if is not set

=head2 pa_has

Check if some parameter is at all set

=head2 r (or route)

Adding a new dispatcher for this class (see L<Web::Simple>)

=head2 pr (or post_route)

Adding a new dispatcher for this class who only reacts on B<POST>.

=head2 middleware

Adding a L<Plack::Middleware> to the flow

=head2 url

Get an url, via joining all parameters url encoded 

=head2 text

Make a simple B<text/plain> response with the text given as parameter

=head2 redirect

Make a simple redirect to the url given as parameter

=head1 SEE ALSO

=over 4

=item L<Task::Yeb>

Overview of all approved plugins


=head1 SUPPORT


  Join #sycontent on Highlight Getty for fast reaction :).

  Pull request and additional contributors are welcome

Issue Tracker

=head1 AUTHOR

Torsten Raudssus <>


This software is copyright (c) 2013 by Torsten Raudssus.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.