-+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)