Why Squatting?
Below are two tutorial examples of Camping, a Web Microframework written in Ruby.
Alongside them are my two conversions written in Squatting, a Camping-inspired Web Microframework for Perl, written by John Beppu
The Camping Short, Short Example:
require 'camping'
Camping.goes :HomePage
module HomePage::Controllers
# The root slash shows the `index' view.
class Index < R '/'
def get
render :index
end
end
# Any other page name gets sent to the view
# of the same name.
#
# /index -> Views#index
# /sample -> Views#sample
#
class Page < R '/(\w+)'
def get(page_name)
render page_name
end
end
end
module HomePage::Views
# If you have a `layout' method like this, it
# will wrap the HTML in the other methods. The
# `self << yield' is where the HTML is inserted.
def layout
html do
title { 'My HomePage' }
body { self << yield }
end
end
# The `index' view. Inside your views, you express
# the HTML in Ruby. See http://code.whytheluckystiff.net/markaby/.
def index
p 'Hi my name is Charles.'
p 'Here are some links:'
ul do
li { a 'Google', :href => 'http://google.com' }
li { a 'A sample page', :href => '/sample' }
end
end
# The `sample' view.
def sample
p 'A sample page'
end
end
The Squatting Short, Short Example:
use strict;
use warnings;
{
package ShortShortExample;
use base 'Squatting';
}
{
package ShortShortExample::Controllers;
use Squatting ':controllers';
our @C = (
C(
Index => [ '/' ],
get => sub {
my ( $self ) = @_;
$self->render( 'index' );
},
),
C(
Page => [ '/(\w+)' ],
get => sub {
my ( $self, $page_name ) = @_;
$self->render( $page_name );
}
),
);
}
{
package ShortShortExample::Views;
use Squatting ':views';
use HTML::AsSubs;
our @V = (
V( 'html',
layout => sub {
my ( $self, $v, @yield ) = @_;
html(
title ( 'My HomePage' ),
body ( @yield ),
)->as_HTML;
},
index => sub {
my ( $self, $v ) = @_;
return (
p ( 'Hi my name is Charles.' ),
p ( 'Here are some links:' ),
ul (
li ( a( { href => 'http://google.com' }, 'Google' ) ),
li ( a( { href => '/sample' }, 'a sample page' ) ),
),
);
},
sample => sub {
my ( $self ) = @_;
p ( 'A sample page' );
},
),
);
}
1;
The Camping Tutorial Two:
require 'camping'
Camping.goes :Nuts
module Nuts::Controllers
class Index < R '/'
def get
@t = Time.now.to_s
render :sundial
end
end
end
module Nuts::Views
def layout
html do
head do
title { "Nuts And GORP" }
end
body { self << yield }
end
end
def sundial
p "The current time is: #{@t}"
end
end
The Squatting Tutorial Two:
use strict;
use warnings;
{
package Nuts;
use base 'Squatting';
}
{
package Nuts::Controllers;
use Squatting ':controllers';
our @C = (
C(
Index => [ '/' ],
get => sub {
my ( $self ) = @_;
my $v = $self->v;
$v->{t} = localtime;
$self->render( 'sundial' );
},
),
);
}
{
package Nuts::Views;
use Squatting ':views';
use HTML::AsSubs;
our @V = (
V( 'html',
layout => sub {
my ( $self, $v, @yield ) = @_;
html (
head ( 'Nuts And GORP' ),
body ( @yield ),
)->as_HTML;
},
sundial => sub {
my ( $self, $v ) = @_;
p ( "The current time is: $v->{t}" );
},
),
);
}
1;
I’m not going to say much more at this point because I think the code above clearly expresses what’s going on. So just enjoy
/I3az/
Postscript:
The two Camping tutorials were written by Why the lucky stiff the author of Camping. These are no longer available on web because _why was regurgitating them from his own repo/website onto GitHub.
I wrote the Squatting ports of the tutorial back in October 2008 so luckily I had pulled down these Camping tutorials. I found that porting _why’s excellent Camping tutorials were a good way of learning Squatting.
The plan was always to post these on my blog. In fact I have a long list of stuff to post ranging from just a few scribbles to completed prose. I’m just trying to be “logical” about the order of these posts!
So why (excuse the pun!) post these now? The reason will be obvious to most readers…. _why’s strange disappearance from the web overnight.
I not going to conjecture further but I hope all is OK. So this post is my little ode to _why.
Below are some links on this strange event:


