squatting icon indicating copy to clipboard operation
squatting copied to clipboard

A Camping-inspired Web Microframework for Perl

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