The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.


                                                                  -+m
                                                                 .%- ..
  [ Squatting ]                                                . m*#-+ 
  A Camping-inspired Web Microframework for Perl               m+*##+m.
                                                          ...- m#*#%-..
                                                        --.. +mm###-+-.
                                                      ..- m..*#####*m++
                                                   .--+.-m#m+.%+-m###+
                                                  .-m..###+...% m#m-##% .
                                                     +%+.. -++.+  m--#-+
                                                  .. --..%*-%-    --+#.m
                                                   -  - -.--+# ..   +#m+
                                                        ..#-+%.    +.#..
                                           .    . .    .%#-...     .-+.-
                                   .   -.+m+-. .. .-.++#.*-...       . .
                           ..- .+. ..+..+---+%---.--.--#m#+..        +
                        .-. m .. -.m++m####%###-##%.++*%++ m .
                      . +. m-- *##*#+###..-m+m.++.#-####-%-m.  ..
                      -m#--%###-m+- --+%m..--. -  .-*%####% ..-. -.
                   -...-*##%m+.+-+.++-m#+-. .. . +.+%%-#m..m#%m+..-.
                   -..*#**m.-.+..-.m+-##+.-       +m-+*%- %-- %##-
                 ...++*++.. . .     +m##*-.       -.%m+ +  -.-++%+-
                . ++###.%.--   . . *m+##%%.     .-%-#-    .  ...#...
                 ..%*+m       . + m+####%..     .-+%#+-       .-#--
                 -.#mm..    --.- +%#-m#%%     ...%+##%+        .+..\-
                .+mm%+ .. ..m-m.+%%+m**+..    --.##%m--.        + #-.
                .--%%.   . m .#++ %-- +mm-.  ...m##m-.+         -+*--
                 +-#+-   . .##+..   +..m     .m-#%#%--          -.##-.
               .%.**+. ...m#%..- .. ...# m . +-%#.%+           . %#%..+
               -+##%.+..  #-. -.       .m+..m -#%mm            .--**++
               .-%.*m+-...mm+        . .+ +-  -m-+.            ..*#.. .
               .-+*m#%m**++-+        ..  -##.%%.-            - ..##+-.
               - +-*%##%+mm--+          . .#m-m-           - -+.m.##-+.
                .. m*##*#*%-m+-  - .    . .m.+.m      ..     m%+.*-% -
                ...+##m%####m-+m- -.   .. ..- ++..  .  +.. +%-###m-%.
                 ..%#-%#++%####.+.m-+.     . +m#+#+%.. . -#*###m.--
                 . %-mm ++-mm+**##%mm.   - .+mm#+*.+--.#/##-+-+m    .
                ..+.#    - +-. m%m#m#*+.-..+##*###%m#%#% .--- - . .
                .-m#m. .  .  ..m+...#%m--+-*#+######.%+..  .+
              ..m-#%. .      ..- .+--  -   .---.-**-+--...
             .+.#m#m-            ..   . . - -..- ..*
            . +-##-+. .                     --  . ..
             .+##m%+
              .%.---
             ..  .
              ...

  http://en.wikipedia.org/wiki/Squatting
  https://github.com/beppu/squatting


The API (should fit comfortably in your head with plenty of room to spare).
---------------------------------------------------------------------------

## [0] BEGINNING AN APP

  package App;
  use Squatting;  # <-- This use statement is where the magic happens.
                  #
                  # %App::CONFIG
                  # &App::D
                  # &App::Controllers::R
                  # @App::Controllers::C
                  # %App::Controllers::C
                  # &App::Controllers::C
                  # &App::Views::R
                  # @App::Views::V
                  # %App::Views::V
                  #
                  # @App::ISA = qw(Squatting); 
                  #       # ...and Squatting->isa('Class::C3::Componentised')

## [1] CUSTOMIZING AN APP

  our %CONFIG = (
    # App configuration goes in a hash.
  );

  # Code that needs to run when the app starts goes in init().
  sub init {
    my ($class) = @_;
    $class->next::method();
  }

  # Code that needs to run on every request goes in service().
  sub service {
    my ($class, $controller, @args) = @_;
    
    # before controller

    my $content = $class->next::method($controller, @args);

    # after controller

    return $content;
  }

  1;

## [2] DEFINE CONTROLLERS

  package App::Controllers;
  our @C = (

    C(
      'Home' => [ '/' ],
      get => sub {
      }
    ),

    C(
      'Post' => [ '/(\d+)/(\d+)/(\w+)' ],
      get => sub {
        my ($self, $year, $month, $slug) = @_;
      },
      post => sub {
        my ($self, $year, $month, $slug) = @_;
      }
    )

    C(
      'Comment' => [ '/comment' ],
      post => sub {
      }
    )

  );

  1;

## [3] DEFINE VIEWS

  package App::Views;
  our @V = (
    V(
      'Default',

      layout => sub {
        my ($self, $v, $content) = @_;
        # This optional method allows you to wrap the content
        # that your template methods return.
        return "HEADER $content FOOTER";
      },

      _partial => sub {
        my ($self, $v) = @_;
        # If you want a view to not be wrapped by the layout,
        # its name should begin with "_".
        return "exactly what you want";
      },

      wrapped => sub {
        my ($self, $v) = @_;
        # This template's name does not begin with "_" so it
        # WILL be wrapped by the layout.
        return "wrapped content";
      }

      _ => sub {
        my ($self, $v) = @_;
        # If a named template method is not found, this method
        # will be run.  Think of it as AUTOLOAD for views.
        return "something";
      },

    ),
  );
                                    
  1;


SUMMARY OF THE SQUATTING API
----------------------------

%App::CONFIG            Where your app configuration is expected to be

&App::init              Code that runs on applicationn initialization

&App::service           Code that runs on every HTTP request

App::Controllers        Package where controllers are expected to be

@App::Controllers::C    Array where controllers are expected to be

&App::Controllers::C    Helper function for creating Squatting::Controller
                        objects

&App::Controllers::R    Helper function for generating URL paths;
                        Think "R" for "route".

App::Views              Package where views are expected to be

@App::Views::V          Array where views are expected to be

&App::Views::V          Helper function for creating Squatting::View objects

&App::Views::R          Helper function for generating URL paths;
                        It's the exact same function as &App::Controllers::R.
                        &App::Controllers::R == &App::Views::R


You should be able to memorize this quite easily, and I hope you
never have to use a search engine to figure out how any of this works.
The entire API should fit comfortably inside your mind with plenty of
room to spare.


For more information: 
  `perldoc Squatting`
  `perldoc Squatting::Controller`
  `perldoc Squatting::View`


For practical examples, see:
  Rhetoric     (a simple blogging system)
  Pod::Server  (a POD browser)
  Stardust     (a COMET server)