Catalyst - refactor large apps with it and have fun!
1. Catalyst - refactor & have fun
– refactor large apps
with tE@M (of individuals)
and have fun!
Adam Bartosik, krakow.pm
2. What we had?
24
Existing datawarehouse with CGI web interface
365
working (mostly) 24h*365
build by many people
Perl supports individuality
Large projects HATE this
3. What we had?
Codebase: different styles of programming /
how perl was growing
in-line script / eval { main() } / procedural
split into packages
3 approaches to html templates
3 database wrappers
own date-time counting libs
hacks, hacks, hacks.../ bugs, bugs, bugs...
4. What we had / we want
perl is not too formal a language. Great for
things you need to change,
develop the way you've never thought before
/what we mostly do/.
The bigger a perl project is,
the more rules you need to obey.
warnings, strict, perl-critic are just about code
quality, not about design practices
XP, test-approach, test-suits - hard to start but
make work easier, safer and faster (changes
are welcome!)
5. What we want?
make it the best possible way
make it easier
maintainable
learn something new, have fun :)
6. Choosing new platform
hours of talking, advocating
use CPAN instead of self-made libs (opposit to
company politic?)
they have better doc
better tested
are still being developed
eg. DateTime is slower than simple $date, but
checks ranges
SQL::Abstract can quote everything
TT can move view-logic to templates
7. web framework needed!
we don't like to deal with sessions, url handling,
redirecting (handling simple redirect in cgi is
NOT simple)
CGI::App is like glue, but we need fundaments
it should be popular enough to have some
support level /work must be done/
so the winner is...
8. Catalyst ++
Catalyst – similar to Rails
MVC – code / layout / data source
MUST (/should) be split :)
directory layout
can start web app in a minute
most of web tasks (sessions, url mapping,
redirects) are one-liners
self server to test changes (quick start for
developers)
9. Catalyst --
hard to find good doc (but going better)
too flexible, TIMTOWTDI
what to use for O/R mapping?
which templates?
type of config file?
session storage?
view type?
Rails, Django are easier to start with, have
better doc, marketing, hype, ”proper way to do
it”
10. Learning curve
?
start-up: first 2-3 weeks are the worst
tutos, docs, advent calendars, Handel, different
approaches, different results
logical or a crap we wasting time on?
11. Learning curve
Template Toolkit make life easier:
pass complex data [ {name=>bar}, {name=>baz} ]
to templates, iterations are done in tpl
<ul> [% FOREACH row IN rows %]
<li>[% row.name %]
[% END %] </ul>
easy Ajax integration
can switch totally different layouts (we needed it 3
months later – nice to be possible do this without big
hacks)
Don't forget Mason => no another lang in tpl
12. Learning curve
DBIx::Class – rapid ORM interface
use when it is worth to use
it is not trivial to rewrite complex SQL queries to
dbix, does not simplify complicated joins (we have
datawarehouse, a little more than blog – SQL can be simpler)
dbix is powerfull for data updating
$post = $c->model('app::comment')->create({
nick => $c->req->{'nick'},
value => $c->req->{'value'} });
$post->update;
13. Learning curve
Easy ”hard CGI things”
dynamic redirect (after save, redirect user to eg.
main page)
sub save : Local {
my ($self, $c) = @_;
# save
# redirect
$c->res->redirect($c->uri_for('/'));
}
14. Learning curve
Global ”catch-flag”, eg:
change language
choose output format
app/Controller/Root.pm
sub pdf : Regex('.?pdf$') {
my ($self, $c) = @_;
my $redir = $c->req->path;
$redir =~ s/.pdf$//;
$c->stash->{output_pdf} = 1;
$redirect =~ s{/$}{/index};
$c->forward($redirect);
}
15. Learning curve
Preserve link layout (when SEO matters)
URL: /news/what-about-perl6.html
sub news : LocalRegex('^/(.+).html$') {
my ($self, $c) = @_;
my $title = $c->req->captures->[0];
# find this article by $title...
}
16. Learning curve
Still no best answer to all
form/multiform/validation tasks.
HTML::Widget
Form::Builder
everything is possible, but typically breaks mvc
MVC: Forms design should be in templates
(view, css, layout), not in controllers,
validation rules for input data should be placed
in models (see Rails approach)
17. Learning curve
Web-services – SOAP, XML-RPC, REST – to
share data with other systems/projects
just output xml/yaml/anything
sub xml : Local {
$c->res->body(XMLout($data)); # kiss/works
}
build simple controller with pure TT and xml
template (fast when you must pass defined output,
DTD/Schema)
many plugins/controllers in CPAN, eg.
C::P::Flavour, see also Catalyst Cookbook / simply
ask what kind of abstraction for WS you need
18. Catalyst is social!
easy to work together – code is split /by design/
into many parts
no global switches/routing rules => less
conflicts in code repository
the team can scale: start with 2, growth to 5 or
more
19. Catalyst is social!
We must obey some rules & conventions – what,
where, how – work in team need some rules
=> they make life easier
why develop own libs when there are so many
good on CPAN? We can fix bugs, extend them,
contribute to open source
less own codebase => lower costs
more developers => better approaches
other features => can need them in 2 or 3 months
20. Benefits after time
Months of active developemt but codebase is
still fresh (and it is perl, true!)
Clear design
Only ”business application” code
Less to type
We can make deep changes:
multi-level caches for balanced nodes
with pre-caching
change layout as often as is needed by marketing :)
21. Benefits after time
Catalyst works like a web-processing
meta-language
It is not that (dirty) perl, it is a Catalyst