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 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments