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