
=head1 NAME

Mojolicious::Guides::CodingGuidelines - Coding guidelines

=head1 OVERVIEW

This document describes the coding guidelines that are the foundations
of L<Mojo> and L<Mojolicious> development.

Please do not send patches unless you agree with them.

=head1 MISSION STATEMENT

L<Mojo> is a runtime environment for Perl real-time web frameworks. It
provides all the basic tools and helpers needed to write simple web
applications and higher level web frameworks such as L<Mojolicious>.

All components should be reusable in other projects and in a UNIXish way
only loosely coupled.

Especially for people new to Perl it should be as easy as possible to
install Mojolicious and get started. Writing web applications can be one of
the most fun ways to learn a language!

For developers of other web frameworks it should be possible to reuse all the
infrastructure and just consider the higher levels of the L<Mojolicious>
distribution an example application.

=head1 RULES

=over 2

Web development should be easy and fun, this is what we optimize for.

The web is a moving target, to stay relevant we have to stay in motion too.

Keep it simple, no magic unless absolutely necessary.

The installation process should be as fast and painless as possible. (Less
than a minute on most common hardware is a good rule of thumb)

Code should be written with a Perl6 port in mind.

The addition and modification of features is decided by majority vote or the
pumpking.

Any core developer may nominate a new one, who must then be accepted by a 2/3
majority vote.

The pumpking has veto rights and may select his successor.

It's not a feature without a test and documentation.

A feature is only needed when the majority of the userbase benefits from it.

Features may only be changed in a major release or after being deprecated for
at least 3 months.

Refactoring and deprecations should be avoided if no important feature
depends on it.

New features can be marked as experimental to be excluded from deprecation
policies.

A major release is signaled by a new major version number and a unique code
name based on a unicode character.

Only add prereqs if absolutely necessary and make them optional if possible.

Domain specific languages should be avoided in favor of Perl'ish solutions.

No inline POD.

Documentation belongs to the guides, module POD is just an API reference.

The main focus of the included documentation should be on examples, no walls
of text. (An example for every one or two sentences is a good rule of thumb)

Everything should be ordered alphabetically if possible.

The master source code repository should always be kept in a stable state,
use feature branches for actual development.

Lines should not be longer than 78 characters and we indent with 2
whitespaces.

Code should be run through L<Perl::Tidy> with the included C<.perltidyrc>.

No spaghetti code.

Code should be organized in blocks and those blocks should be commented.

Comments should be correctly capitalized, and funny if possible, punctuation
is optional if it doesn't increase readability.

Every file should contain at least one quote from C<The Simpsons> or
C<Futurama>.

No names outside of C<Mojolicious.pm>.

No Elitism.

Peace!

=back

=head1 MORE

You can continue with L<Mojolicious::Guides> now or take a look at the
Mojolicious wiki L<http://github.com/kraih/mojo/wiki>, which contains a lot
more documentation and examples by many different authors.

=cut
