ReCoder (recoder) wrote,
ReCoder
recoder

  • Mood:
  • Music:

Modern Perl

Провёл праздники в перловых пучинах, выбираюсь оттуда просветлённый. Во-первых, наконец-то понял, для чего нужны правильные ORMы на примере DBIx::Class. Во-вторых, посмотрел на Modern::Perl, фичи из Perl6 и общие перспективы на Perl6.

А главное - наигрался с Moose. Это просто чума! На обычном перле такой фантастики наворотить! Сделали мощную объектную метамодель, так что теперь можно определять классы со свойствами, с наследованием, с ролями:

use MooseX::Declare;

class BankAccount {
    has 'balance' => ( isa => 'Num', is => 'rw', default => 0 );

    method deposit (Num $amount) {
        $self->balance( $self->balance + $amount );
    }

    method withdraw (Num $amount) {
        my $current_balance = $self->balance();
        ( $current_balance >= $amount ) || confess "Account overdrawn";
        $self->balance( $current_balance - $amount );
    }
}

class CheckingAccount extends BankAccount {
    has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' );

    before withdraw (Num $amount) {
        my $overdraft_amount = $amount - $self->balance();
        if ( $self->overdraft_account && $overdraft_amount > 0 ) {
            $self->overdraft_account->withdraw($overdraft_amount);
            $self->deposit($overdraft_amount);
        }
    }
}

А ещё сделали мультиметоды как задумывалось в perl6:

package Game;
use Moose;
use MooseX::MultiMethods;

multi method play (Paper    $x, Rock     $y) { 1 }
multi method play (Paper    $x, Spock    $y) { 1 }
multi method play (Scissors $x, Paper    $y) { 1 }
multi method play (Scissors $x, Lizard   $y) { 1 }
multi method play (Rock     $x, Scissors $y) { 1 }
multi method play (Rock     $x, Lizard   $y) { 1 }
multi method play (Lizard   $x, Paper    $y) { 1 }
multi method play (Lizard   $x, Spock    $y) { 1 }
multi method play (Spock    $x, Rock     $y) { 1 }
multi method play (Spock    $x, Scissors $y) { 1 }
multi method play (Any      $x, Any      $y) { 0 }

Или - сделали эксепшны, почти как настоящие:

use TryCatch;

sub foo {
    try {
        # some code that might die
        return "return value from foo";
    }
    catch (Some::Class $e where { $_->code > 100 } ) {
    }
}

Вот такая вот восхитительная магия (или сильное колдунство - кому как). Осталось до конца осознать, как это всё грамотно использовать с Catalyst'ом - и золотой ключик у нас в кармане!

perl

Tags: perl
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments