Coding Style for PLIF
---------------------

This style guide is designed to make sure that the code is consistent
throughout. It isn't necessarily the best way of writing Perl, but it
is consistent. Consistency is more important than using your preferred
method. Please follow the style guide.

Note: Exceptions will be accepted if they improve performance, but
only if they are well commented.


 1. Brackets are preferred to other punctuation

     return ($a eq 'a' or $b); # preferred
     return $a eq 'a' || $b;


 2. Use brackets around all function arguments

     push(@list, $item); # preferred
     push @list, $item;

     foreach $item (sort(keys(%{$self->list}))) { } # preferred
     foreach $item (sort keys %{$self->list}) { }


 3. When calling a method for its side-effect, always use brackets

     $self->go(); # preferred
     $self->go;


 4. When calling a method as if it was a property, omit brackets

     return $self->name; # preferred;
     return $self->name();


 5. Don't use print(), use dump()

     $self->dump(9, "foo called with bar $bar"); # preferred
     print("foo called with bar $bar\n");


 6. To set a property, use the method call notation

     $self->name('foo'); # preferred
     $self->{'name'} = 'foo';


 7. method and property names should start lowercase and have a capital
    letter for each word

     sub myLovelyMethod { ... } # preferred
     sub MyLovelyMethod { ... } # bad (first letter not lowercase)
     sub mylovelymethod { ... } # bad (intervening words not capitalized)
     sub my_lovely_method { ... } # bad (underscores)


 8. methods should start with setting $self and taking their arguments

     sub myLovelyMethod {
         my $self = shift;
         my($argument) = @_;
         # code...
     }


 9. Curly brackets should cuddle

     if ($condition) {
         # do something
     } else {
         # do something else
     }


10. Comments should be indented just like code

     if ($condition) {
         # preferred 
     } else {
     # bad 
     }


11. Avoid using the implicit $_ variable

     foreach my $item (@list) { $item++; } # preferred
     foreach (@list) { $_++; }


12. Thou shalt avoid using useful functions (which break Win32):

     alarm, chroot, crypt, endgrent, endhostent, endnetent,
     endprotoent, endpwent, endservent, fork, getgrent, getgrgid,
     getgrnam, getnetbyaddr, getnetbyname, getnetent, getpgrp,
     getppid, getpriority, getprotoent, getpwent, getpwnam, getpwuid,
     getservent, link, msgctl, msgget, msgrcv, msgsnd, semctl, semget,
     semop, setgrent, sethostent, setnetent, setpgrp, setpriority,
     setprotoent, setpwent, setservent, shmctl, shmget, shmread,
     shmwrite, socketpair, symlink, syscall

     http://ftp.univie.ac.at/packages/perl/ports/nt/FAQ/perlwin32faq5.html


13. When creating a new dependency, make sure you mark it with the
    magic string 'DEPENDENCY', as in:

    sub init {
        my $self = shift;
        my($app) = @_;
        $self->SUPER::init(@_);
        require Some::Module; import Some::Module; # DEPENDENCY
    }

    This allows for an easy listing of each dependency using 'find'
    and 'grep'. Note also the way that dependencies are generally
    imported inside service constructors and imported using 'require'
    and 'import' instead of 'use'. This is to make sure that the
    overhead of importing the relevant code is not hit unless the
    module is used. Please make sure that 'import' doesn't end up
    being called more than once, of course.


14. The order for declaring methods should be something along the
    lines of first class methods, then the constructor (in PLIF this
    is 'init'), then the methods you are overriding, then the new
    methods, then the destructor ('DESTROY'). This isn't cast in stone
    though. Whatever works best.


Further notes:

You'll notice PLIF doesn't use prototypes. This is because Perl
doesn't support prototypes for method calls.

- end -
