Modern Perl

May. 2nd, 2009 11:08 pm
recoder: (Default)
[personal profile] recoder

Провёл праздники в перловых пучинах, выбираюсь оттуда просветлённый. Во-первых, наконец-то понял, для чего нужны правильные 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

December 2024

S M T W T F S
1234567
891011121314
15161718192021
22232425 262728
293031    

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 2nd, 2026 01:33 pm
Powered by Dreamwidth Studios