[Catalyst] Beginner Info (Part 1, perhaps with more to follow)
Geoffrey Ferrari
geoffrey.ferrari at oriel.oxford.ac.uk
Sun Jan 15 12:34:14 CET 2006
I made a request recently for better documentation for beginners. As
Kieren Demont pointed out, Catalyst is a community project, so if I
think there's a lack of beginner documentation, perhaps I ought to
help write some.
A few other helpful bods have posted (links to) introductory
documentation in response to my request. But I saw nothing that
answered specifically to my own needs. In particular, what I think is
lacking is a general conceptual overview of Catalyst which answers
some very basic questions like those listed in my previous email.
Since this is likely to be long enough as it is, I'd prefer not to
include a potted history of CGI programming (as did raptor on 13th
January), nor jump straight in an example application (as does Pete
Sergeant's tutorial in his 13th Jan email). Don't get me wrong, both
of these fulfil useful functions. But to Pete I say that I followed
several example application tutorials, and still had difficulty
inferring general principles from the particular examples. And to
Raptor I say that I suspect his potted history of CGI was intended
mainly as just one way of giving a conceptual overview of catalyst by
illustrating the design choices and the problems they are supposed to
solve. If that's the case, it's more direct to aim straight for the
conceptual overview.
So, with this in mind, I've written an extremely general overview of
Catalyst. It's adopts the principle that things should be explained
so as to make Catalyst comprehensible to an audience with a specified
set of background knowledge. If anyone wants to extend it, I beg them
to abide by that principle!
Two things count against my writing this kind of beginner's
documentation. First, I'm a beginner myself, which may result in the
blind attempting to lead the blind. Second, my free time is limited.
Nevertheless, I think there is a great need for beginner's
documentation, so I'll try to help write some as best I can.
Feedback to this list please.
Beginner Info Part 1
===============
=head1 What is Catalyst?
If the answer "Catalyst is an elegant MVC web application framework"
does not help you, you've come to the right place. This document is
for beginners: beginners to web application frameworks in general,
and beginners to Catalyst in particular. The only knowledge it
presupposes is a reasonable level of familiarity with:
- the perl programming language
- how to split your perl code into packages and modules
- object-oriented programming in perl
- perl programming for the web (to give its proper name, CGI
programming)
If you are not reasonably familiar with all of these, there are many
resources on the net and some excellent books that cover these topics.
The purpose of this document is to give someone with only the
knowledge presupposed above a conceptual overview of Catalyst. A
conceptual overview is not a manual or a tutorial, though a beginner
should find it a helpful complement to a manual or tutorial. A
conceptual overview aims to do two things:
(1) to describe at the most general level what Catalyst is
(2) to help the user to understand why Catalyst was designed to be as
it is.
=head1 So again, what is Catalyst?
Catalyst, at the most basic level, is a perl application that aims to
help you write perl applications. I shan't try to define what an
application is - I assume that you already have a reasonable grasp of
that - but let's assume for simplicity that an application is made up
of some files stored on disk, and that these files, when activated,
result in a certain pattern of behaviour. Catalyst itself, and the
applications that it will help you to write, are like that. We can
also assume for present purposes that all the applications that
Catalyst will help you to write are CGI programmes. CGI stands for
Common Gateway Interface, and it refers to a set of protocols which
govern requests and responses over the internet. The vast majority of
web sites conform to CGI specifications. To forestall potential
confusion, you should know that using the famous perl module CGI.pm
is only one way of doing web programming in Perl. Both Catalyst and
CGI.pm have the aim of helping you to write web (that is, CGI)
applications.
So, Catalyst is a perl application which tries to help you write CGI
applications. The key question, then, is how does Catalyst help?
Catalyst provides help in several forms, but the most central kind -
and it is most central because the majority of the help that Catalyst
provides depends on it - is a set of programming conventions.
A set of programming conventions is a set of default rules - some of
which can be overriden, some of which can't - about how your perl web
application will be structured. We'll get on to looking at some of
those rules later, but why, you might ask, is it worth the trouble of
following the Catalyst rules? There are basically only two reasons
why you should follow the rules of Catalyst, or any other good web
application framework. (A web application framework, by the way, is
really just a set of conventions for writing web applications,
perhaps along with an application that will help you write
applications that conform to those conventions. See! You're making
progress already. Anyway, back to the reasons for following the rules):
Following the rules of a web application framework is good because:
(i) it solves a coordination problem
(ii) it gives elegant solutions to some common problems.
=head2 The Coordination Problem
Let's talk about the co-ordination problem first. Co-ordination
problems arise when you have at least two agents working towards a
common goal. In the context of a web application framework like
Catalyst, one set of agents includes the end users, the programmers
like you and me. The other set of agents strictly speaking is the
Catalyst development team, who write the Catalyst programme and make
it available to the end users. But for simplicity, we'll think of the
second agent as being the Catalyst programme itself. So now we have
our two agents, Catalyst and you. The goal, of course ,is to write
web applications.
On your own you can probably write some pretty cool web applications.
But, if you write your web applications in accordance with the
Catalyst conventions, then Catalyst will be able to do at least some
of the hard work for you. This has a powerful and potentially
frightening result: your perl code now works differently. Don't worry
- it's still perl! But now Catalyst may take your perl code and do
things with it that you wouldn't normally expect and at first won't
be able to understand. This is precisely the sort of thing that is
frightening for a beginner! But let me reassure you. The things that
Catalyst will do with your code are things that most people, most of
the time, find extremely helpful. And whilst you may be frightened by
what Catalyst does, there is an obvious solution: what all beginners
must do is learn the Catalyst conventions. That way you will
understand what Catalyst will do with your code, and thus come to
write code which takes advantage of all the help that Catalyst offers.
To help you to understand how conventions can be helpful, let's
consider an analogy. Usually, if you twitch your finger it
achieves... nothing much. But that's not always the case. In the
context, for example, of an auction house, twitching one's finger
hooks into a set of conventions which give it additional
significance. In an auction, a twitch of the finger can register a
bid, indicate a legally-binding commitment to buy, and indicate that
one will stop by the office after the auction to settle one's
account, thus ensuring that if the auctioneers want your money,
there'll be someone there to take it. The conventions of the auction
house, just like the conventions of Catalyst, are apt to frighten
beginners. But for those in the know, having conventions ensures that
things can be bought and sold with minimal effort. And just as with
Catalyst, the conventions of the auction house solve a co-ordination
problem - in this case, the problem is how you and the auctioneers
can achieve the common aim of a legal, efficient, exchange of goods.
=head2 Elegant Solutions to Common Problems
The second kind of help that Catalyst provides is that some of its
rules were chosen to help you avoid common pitfalls, or, where the
problems are unavoidable, to help you to solve them in an efficient -
perhaps even beautiful or elegant - way. Of course, you could just
try to follow the Catalyst rules without understanding them, but it
will probably make your life easier if you understand why some of
those rules were chosen.
One of the most common problems that Catalyst tries to help you solve
is that of designing one's application so that it is easy to
understand and easy to maintain. Over time, it became clear to some
programmers that most applications have three areas of concern.
What's an area of concern? Basically, an area of concern is one well-
defined problem. All applications try to solve problems. But it's
also possible to sub-divide the big problem that an application tries
to solve into smaller, sub-problems, which you can then deal with
individually. So what I really mean is that over time it became clear
that most applications try to solve three general kinds of sub-problem.
First of all, there is the problem of accessing a store of data,
which your application will certainly want to read, and may also want
to update. The part of your application that tries to solve this
problem is called the Model. For our purposes, we don't care about
the specifics of the data. It can be anything you like - your BT
phone records, weather data, or the results of a poll. It's all data,
and the problem of accessing is solved by the Model part of an
application.
Second, of course, there is the problem of reporting things back to
the user. The part of your application that tries to solve this
problem is called the View. Again, we don't care what is reported
back to the user, but most of the time your user will want some
feedback on the results of his actions.
Finally, there is the problem of doing the right thing in response to
your user's input. The part of your application which tries to solve
this problem is called the Controller. This way of conceiving of the
the various sub-problems of your application is called the Model-View-
Controller design pattern. It's a design pattern because it's a set
of rules for separating your code into three different parts each of
which tries to solve just one of the three sub-problems just described.
=head2 An example
Let's recap for a second and discuss an example. I said above that
the most central kind of help that Catalyst provides is a set of
conventions. If you abide by those conventions when you write your
web application, then your perl code will take on added significance
and behave differently than it normally would. Let me give you an
example. Whether you think this is an example of Catalyst solving the
co-ordination problem or Catalyst providing an elegant solution to a
common problem doesn't really matter. In fact, it's an example of
Catalyst doing both.
The CGI protocol ensures that all web applications consist of a
request from the user and a response back to the user from the
application. The way the user makes a specific request is by making a
request for a specific resource. The names for these resources comine
in the form of a URI e.g. 'http://www.greatapp.com/users/list'. Now,
one of the recurrent problems designers of web applications must face
is how to ensure that the correct piece of code is executed in
response to a request for a specific URI. One way or another, the
application (broadly conceived) must have a way of mapping individual
requests to invididual sections of code.
This is such a common problem that the Catalyst development team came
up with an elegant solution to the problem. The way to solve this
problem, according to Catalyst, is to let your Controller modules
mirror your URLs. Of course, there is some flexibility in the
mirroring. But in the simplest case, the Catalyst convention is that
a URI that ends in, say, '.../users/list', will call the 'list'
method of the 'users' controller module. As we shall see in a moment,
Catalyst gets you to organise your packages and modules under three
directories, one for each of the Model, View and Controller problems
that your code tries to solve. So, in this case, we would have a
controller module called Users.pm under the Controller directory, and
in that module we would have a subroutine called 'list'. There are
other ways to achieve the required URI to code mapping, but this is
the simplest and one of the most often used.
But that's not all that Catalyst does for you. So far, all we've done
is come up with a way of organising you code so that there is an
intuitive mapping from URIs to subroutines. We haven't yet done
anything to implement that the user requests are despatched according
to that mapping. And that's the brilliant thing! If you use Catalyst,
you don't have to! In simple terms, Catalyst automatically handles
the URI to subroutine despatching for you. If you want to do
something in response to a request for '../users/list', all you have
to do is make a module, Users.pm, under your Controller directory,
and then put a subroutine, 'list', in that module, and that is enough
to ensure that that piece of code will get called in response to that
request. So you see, Catalyst not only provides an elegant solution
to the common problem of URI to code mappings, but since it 'knows'
that you will follow those rules, Catalyst can do something else for
you, too. Knowing that you'll follow the elegant solution to the
problem of mapping URIs to code also solve sa co-ordination problem
that allows Catalyst to perform automatic URI to subroutine
despatching. And that's a really helpful thing for Catalyst to do!
In fact, as we'll see later, Catalyst does one more thing which is
really helpful in this example. You know from past experience that if
you have code in a module, say in .../Controller/Users.pm, then in
order to deploy that module you have to have a
'use ..::Controller::Users;' somewhere in your application. Well,
there is a convention in Catalyst that all your code is located under
the directories ../Model, ../Controller, and ../View. If you follow
that convention, then, because Catalyst knows where to look for your
modules, it can load them automatically for you. That way you don't
need to worry about maintaining a lot of 'use' statements. If you put
your modules where Catalyst knows to find them, they'll be loaded
automatically.
More information about the Catalyst
mailing list