package Example::Controllers; use strict; use warnings; use base 'Squatting::Q'; use Squatting ':controllers'; use Data::Dump qw(dump); sub add { my $sum = 0; $sum += $_ foreach(@_); $sum } our @C = ( C( Home => [ '/' ], get => sub { my ($self) = @_; my $v = $self->v; my $input = $self->input; $v->{life} = 'good'; $v->{bavl} = 'realized'; $v->{input} = $input; if (%$input) { $v->{sum} = add(values %$input); } $self->render('home') } ), C( Profile => [ '/~(\w+)\.?(\w+)?' ], get => sub { my ($self, $name, $format) = @_; $format ||= 'html'; my $v = $self->v; $v->{name} = $name; $v->{controller} = $self->name; $v->{_secret_from_json} = 'The JSON view will purposely omit this data, '. 'because the $V{json}->profile template was written to '. 'ignore the key, _secret_from_json.'; $self->render('profile', $format) # This will use the _specific_ json template called 'profile' # if ($format eq 'json'). } ), C( Count => [ '/@count' ], # GET requests to the Count controller have the following properties: # - They are sent to a different session queue. # - The session queue is named "${session_id}.count". # - The subroutine attribute Q(count) is what made that happen. # - Squatting::Mapper is aware of Q-attributed subroutines. # - It will run in its own coroutine separate from the RESTful controllers. # - This coroutine may handle many more HTTP requests. get => sub : Q(count) { my ($self) = @_; my $cr = $self->cr; my $i = 1; while (1) { # - In fact, this one won't ever return control back to Squatting. # - You're in Continuity land, now. $cr->print($i++); $cr->next; } }, post => sub { } ), C( RubyGems => [ '/rubygems' ], get => sub { my ($self) = @_; $self->redirect('http://localhost:8808/'); } ), C( Env => [ '/env', '/env.json' ], get => sub { my ($self) = @_; my $v = $self->v = $self->env; my $format = ($v->{REQUEST_PATH} eq '/env') ? 'html' : 'json'; $self->render('env', $format); # This will use the generic json template called '_' # if ($format eq 'json'). # The generic template, '_', is used # when no other template can be found. } ) ); 1;