Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-05-18

MooseのRoleでAOP

|  MooseのRoleでAOP  - dann@catalyst を含むブックマーク はてなブックマーク -  MooseのRoleでAOP  - dann@catalyst  MooseのRoleでAOP  - dann@catalyst のブックマークコメント

aroundのキーワードで指定できるメソッドが1つになってしまうからAOP目的では使えないけれど、around 'do_*' のように指定できるようになれば、Roleを複数のクラスに組み込めて使えるようになる。

だから、Transactionのように明示的にメソッドを指定したい場合には、aroundのmodifierにメソッドを登録するところを少し書き換えるだけでいけると思う。Mooseにパッチあてたいなぁ、これは。

package指定のようなjoinpointの指定はできないけれど、実際にパッケージ指定みたいなので使う場面はログ系くらしかないので、無くても困らないかもしれない。

で、実際、DIコンテナでweavingするよりも、こっちのほうが現実的かなぁという気がする今日この頃。

SausanSausan2012/07/22 03:08That's an apt asnewr to an interesting question

anffdvuzfokanffdvuzfok2012/07/22 19:26SnO9c2 <a href="http://nzylyqfxwrpo.com/">nzylyqfxwrpo</a>

gkortwsgkortws2012/07/23 09:12h7HQQi , [url=http://bbbhbdzycttv.com/]bbbhbdzycttv[/url], [link=http://rnggguldzngk.com/]rnggguldzngk[/link], http://wzokbsjxqcvn.com/

odysrqkoodysrqko2012/07/24 08:40pwUvtl <a href="http://xocfinihwmxt.com/">xocfinihwmxt</a>

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080518

2008-05-03

hasのrequired

|  hasのrequired - dann@catalyst を含むブックマーク はてなブックマーク -  hasのrequired - dann@catalyst  hasのrequired - dann@catalyst のブックマークコメント

これも仕様を明記するという点でいいなと思う。そのインスタンス変数が必須なのかオプショナルなのかっていうのが見れば分かる。

required => (1│0)

This marks the attribute as being required. This means a

defined value must be supplied during class construction, and

the attribute may never be set to "undef" with an accessor.

後はBread::BoardでDIするときにもいいかなぁと。このインスタンス変数にDIしわすれたとかいうのを防ぐことができる。

buildじゃなくてhasの+で上書き

|  buildじゃなくてhasの+で上書き - dann@catalyst を含むブックマーク はてなブックマーク -  buildじゃなくてhasの+で上書き - dann@catalyst  buildじゃなくてhasの+で上書き - dann@catalyst のブックマークコメント

hasの+でsubclassでdefaultを上書きできる。ってことで、実はbuildなくても殆どのケース困らない気がしてしまった。buildがどうしても必要になるケースってあんのかな。

メリットがあるとすれば、明示的にbuildだけを上書きすればいいっていうのがわかるってことくらいなのかなぁ。

             package Foo;
             use Moose;

             has ’message’ => (
                 is      => ’rw’,
                 isa     => ’Str’,
                 default => ’Hello, I am a Foo’
             );

             package My::Foo;
             use Moose;

             extends ’Foo’;

             has ’+message’ => (default => ’Hello I am My::Foo’);

ka-nachtka-nacht2008/05/04 23:11ftpluginにしているならば:autocmdのパターンは*でなく<buffer>を指定し、各種:mapには<buffer>を指定すべきです。
今の記述では'filetype'がperlなバッファを開かれた際に各種設定が全バッファに対して有効になります。特に:autocmdは'filetype'がperlなバッファを開くたびに同じものが追加されていくのでバッファの保存時に同じ動作が複数回行われることになります。

danndann2008/05/05 02:29おぉ、ありがとうございます。

SevenSeven2011/12/30 11:35Good to see real expertise on dipslay. Your contribution is most welcome.

lnuadjvlnuadjv2011/12/30 19:298VZuNg <a href="http://xdgfwxgfsesx.com/">xdgfwxgfsesx</a>

atabaoatabao2011/12/31 22:27AejGt0 , [url=http://jzqszuxdfpva.com/]jzqszuxdfpva[/url], [link=http://qadlawxatmqq.com/]qadlawxatmqq[/link], http://udyntwmlzejv.com/

iumuxzhfiumuxzhf2012/01/02 02:59NXCef8 , [url=http://bqzxitpxnvhn.com/]bqzxitpxnvhn[/url], [link=http://khtunmodqxym.com/]khtunmodqxym[/link], http://iovvsttbnacz.com/

2008-05-02

コラボレータのデフォルト値設定は基本builderで

|  コラボレータのデフォルト値設定は基本builderで - dann@catalyst を含むブックマーク はてなブックマーク -  コラボレータのデフォルト値設定は基本builderで - dann@catalyst  コラボレータのデフォルト値設定は基本builderで - dann@catalyst のブックマークコメント

defaultじゃなくて、builderを使おうという話。

http://code2.0beta.co.uk/moose/svnweb/index.cgi/moose/view/Moose/trunk/lib/Moose/Cookbook/Recipe9.pod

要するにdeffaultでcoderefを書いてしまうと、サブクラスで違うものを使いにくいから、builder使って、sub classでbuilderのメソッドを上書きできるようにしようというもの。

If the default value is a simple scalar that only needs to be

calculated once (or a constant), use C<default>.

If the default value is an empty reference that needs to be wrapped in

a coderef like C, use C<default>.

Otherwise, use C<builder>.

This ensures that your classes are easily subclassable, and also helps

keep crufty code out of your attribute definition blocks.

MooseでDelegationを簡単

| MooseでDelegationを簡単 - dann@catalyst を含むブックマーク はてなブックマーク - MooseでDelegationを簡単 - dann@catalyst MooseでDelegationを簡単 - dann@catalyst のブックマークコメント

dmakiさんのコードを見て知ったのですが、handlesを使えばよいです.

package HTTP::Engine::Request;
use Moose;
use HTTP::Engine::Types::Request qw( Header );
use HTTP::Headers;

has headers => (
    is      => 'rw',
    isa     => 'Header',
    coerce  => 1,
    default => sub { HTTP::Headers->new },
    handles => [ qw(content_encoding content_length content_type header referer user_agent) ],
);

...

上記の例だとHTTP::Headersへ処理を委譲することができます。

上記の例のように、そのままのメソッド名でdelegationするのもできますが、Hashを渡すことで別名でdelegationすることもできます。

perldoc Mooseで、Hashの場合のdelegationの例が書いてあるので、それを見るのがよいです。

委譲するコードがとてもドライにかけるのでこれはよいですね。

Mooseでクラス属性

| Mooseでクラス属性 - dann@catalyst を含むブックマーク はてなブックマーク - Mooseでクラス属性 - dann@catalyst Mooseでクラス属性 - dann@catalyst のブックマークコメント

MooseX::ClassAttributeを使う

http://search.cpan.org/~drolsky/MooseX-ClassAttribute-0.04/lib/MooseX/ClassAttribute.pm

なんで、これMooseに標準で入ってないんだろうなぁ。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080502

2008-05-01

MooseX::Types使って型定義

|  MooseX::Types使って型定義 - dann@catalyst を含むブックマーク はてなブックマーク -  MooseX::Types使って型定義 - dann@catalyst  MooseX::Types使って型定義 - dann@catalyst のブックマークコメント

http://search.cpan.org/~phaylon/MooseX-Types-0.04/lib/MooseX/Types.pm

MooseX::Typesを使って、MyApp::Types::Core とか作ると、subtypeの定義を別のクラスに出すことができます。

型定義(subtype, coerce)は基本的に使いまわしたいもののはずなので、オレオレTypesを発展させて使いまわせるようにしておくと、使いどころが結構ありそうだなぁという気がします。

moose版のHTTP::Engineのほうも、Typesを別ディレクトリに分けてみました。もう少し型が増えれば、Typesの存在意義がでてくるんじゃないかと思います。あまり再利用がされなくても、クラス定義内にtype定義があるよりは、外に出したほうが美しいかなという気がするのでいいような気がしてます。

Perl+Java+Rubyな仕組みをMooseで

|  Perl+Java+Rubyな仕組みをMooseで - dann@catalyst を含むブックマーク はてなブックマーク -  Perl+Java+Rubyな仕組みをMooseで - dann@catalyst  Perl+Java+Rubyな仕組みをMooseで - dann@catalyst のブックマークコメント

Rubyっぽく全てをオブジェクトとして扱えて、Javaっぽく制約をつけられて、Perlっぽくプラグインを増やせて、CPANで多くのライブラリも使えるというのが、自分の中で思っているいいとこ取りの理想の形態だなぁと思ってます。

Moose+autoboxで殆ど実現できるじゃん!ってところで、面白そうなところだなぁって思ってます。

Class::MOP++

autobox++

# パフォーマンス的にどうなるのかは気になるところですが、これはえろい人がチューニングしてくれるんじゃないかと。toyプロジェクトじゃないもので誰かが使えば結構流行るんじゃないかなぁ。

Mooseの気持ちいいところ

|  Mooseの気持ちいいところ - dann@catalyst を含むブックマーク はてなブックマーク -  Mooseの気持ちいいところ - dann@catalyst  Mooseの気持ちいいところ - dann@catalyst のブックマークコメント

Mooseは、

  • 自然にOOできる仕組み
  • Java的にかっちり作る仕組み(interface+型による制約)
  • meta programmingを簡単にできる仕組み(Perlの黒魔術的なコードから開放される)
  • AOP的な横断的な関心毎を切り離す仕組み

があって、自然にコードを書けるのが気持ちいいなぁと思います。