Skip to content
A Camping-inspired Web Microframework for Perl
Perl Perl6 Other
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
bin
doc
eg
lib
t
xt
.gitignore
.shipit
Changes
EARLY_NOTES
MANIFEST
MANIFEST.SKIP
MIT-LICENSE
Makefile.PL
README
edit

README


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

Something went wrong with that request. Please try again.