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