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