Sugarを介さずMouseを使う

「MouseはいいけどDSLはちょっと」とbonnuさんやxaicronに言われたのですが、実はDSLを介さずにもMouseは使えます。使い方はMouse.pmを読むとだいたいわかります。
要はインターフェイスがバックエンドと分離しているから好きなように変えられるってことです。

以下は例ですが、真面目にやるならextends()やwith()のサポートもしたほうがいいですね。

package MouseX::Lite;
use 5.14.0;
use strict;
use warnings;
use Mouse ();
use Data::Util ();

sub import {
    my $class = shift;
    $class->define_class(scalar(caller), @_);
    return;
}

sub define_class {
    my $class = shift;
    my $into  = shift;
    my $args  = Data::Util::mkopt(\@_, 'define_class');
    my $meta  = Mouse->init_meta(for_class => $into);
    for my $pair(@{ $args }) {
        my($name, $attr) = @{$pair};
        my %attr = Data::Util::is_array_ref($attr) ? @{$attr}
                 : Data::Util::is_hash_ref($attr)  ? %{$attr}
                 :                                   ();
        $attr{is} //= 'rw';
        $meta->add_attribute( $name => %attr );
    }
    $meta->make_immutable();
    return;
}

1;

使い方はこんな感じ。

use 5.14.0;

package Point {
    use MouseX::Lite
        x => { isa => 'Int' },
        y => { isa => 'Int' },
    ;
}

say Point->new(x => 10, y => 20)->dump;