Permalink
Browse files

imported 0.79 translation

  • Loading branch information...
charsbar committed Jun 29, 2009
1 parent 0416d9d commit 3ff70eb663c9e8cd4631f544124c85ad190be8b1
Showing with 1,071 additions and 951 deletions.
  1. +9 −11 Moose/Cookbook.pod
  2. +4 −0 Moose/Cookbook/Basics/Recipe1.pod
  3. +61 −186 Moose/Cookbook/Basics/Recipe10.pod
  4. +50 −50 Moose/Cookbook/Basics/Recipe11.pod
  5. +0 −93 Moose/Cookbook/Basics/Recipe12.pod
  6. +5 −1 Moose/Cookbook/Basics/Recipe2.pod
  7. +4 −0 Moose/Cookbook/Basics/Recipe3.pod
  8. +4 −0 Moose/Cookbook/Basics/Recipe4.pod
  9. +4 −0 Moose/Cookbook/Basics/Recipe5.pod
  10. +4 −0 Moose/Cookbook/Basics/Recipe6.pod
  11. +4 −0 Moose/Cookbook/Basics/Recipe7.pod
  12. +110 −0 Moose/Cookbook/Basics/Recipe8.pod
  13. +187 −61 Moose/Cookbook/Basics/Recipe9.pod
  14. +4 −0 Moose/Cookbook/Extending/Recipe1.pod
  15. +6 −5 Moose/Cookbook/Extending/Recipe2.pod
  16. +6 −2 Moose/Cookbook/Extending/Recipe3.pod
  17. +5 −4 Moose/Cookbook/Extending/Recipe4.pod
  18. +5 −1 Moose/Cookbook/Meta/Recipe1.pod
  19. +5 −1 Moose/Cookbook/Meta/Recipe2.pod
  20. +4 −0 Moose/Cookbook/Meta/Recipe3.pod
  21. +4 −0 Moose/Cookbook/Meta/Recipe4.pod
  22. +4 −0 Moose/Cookbook/Meta/Recipe5.pod
  23. +4 −0 Moose/Cookbook/Meta/Recipe6.pod
  24. +4 −0 Moose/Cookbook/Meta/Recipe7.pod
  25. +4 −0 Moose/Cookbook/Roles/Recipe1.pod
  26. +4 −0 Moose/Cookbook/Roles/Recipe2.pod
  27. +4 −0 Moose/Cookbook/Roles/Recipe3.pod
  28. +7 −3 Moose/Cookbook/Snack/Keywords.pod
  29. +4 −0 Moose/Cookbook/Snack/Types.pod
  30. +4 −0 Moose/Cookbook/Style.pod
  31. +0 −153 Moose/Cookbook/WTF.pod
  32. +4 −0 Moose/Intro.pod
  33. +13 −1 Moose/Manual.pod
  34. +4 −0 Moose/Manual/Attributes.pod
  35. +8 −4 Moose/Manual/BestPractices.pod
  36. +12 −0 Moose/Manual/Classes.pod
  37. +4 −2 Moose/Manual/Concepts.pod
  38. +7 −3 Moose/Manual/Construction.pod
  39. +4 −0 Moose/Manual/Contributing.pod
  40. +4 −0 Moose/Manual/Delegation.pod
  41. +16 −0 Moose/Manual/Delta.pod
  42. +128 −68 Moose/{Cookbook → Manual}/FAQ.pod
  43. +4 −0 Moose/Manual/MOP.pod
  44. +4 −0 Moose/Manual/MethodModifiers.pod
  45. +4 −0 Moose/Manual/MooseX.pod
  46. +4 −0 Moose/Manual/Roles.pod
  47. +4 −0 Moose/Manual/Types.pod
  48. +311 −0 Moose/Manual/Unsweetened.pod
  49. +7 −4 Moose/Spec/Role.pod
  50. +5 −298 Moose/Unsweetened.pod
View
@@ -1,5 +1,7 @@
=encoding utf8
+=pod
+
=head1 題名
Moose::Cookbook - Mooseの調理法
@@ -46,25 +48,19 @@ C<augment>というメソッドモディファイアの使い方を説明しま
クラスを不変化するとアクセサやオブジェクトの生成が非常に速くなります。
-=item L<Moose::Cookbook::Basics::Recipe8> - トリガを使った複雑なリレーションの管理 (TODO)
-
-(未執筆)
-
-このテストから原稿を起こすこと。 http://code2.0beta.co.uk/moose/svn/Moose/trunk/t/200_examples/007_Child_Parent_attr_inherit.t
-
-=item L<Moose::Cookbook::Basics::Recipe9> - ビルダーメソッドとlazy_build
+=item L<Moose::Cookbook::Basics::Recipe8> - ビルダーメソッドとlazy_build
builder機能を使うと、アトリビュートのデフォルト値を継承やロールの合成を利用して用意できるようになります。
-=item L<Moose::Cookbook::Basics::Recipe10> - 演算子のオーバーロード、サブタイプ、型変換
+=item L<Moose::Cookbook::Basics::Recipe9> - 演算子のオーバーロード、サブタイプ、型変換
繁殖の際に目の色が決まる様子をまねながら、演算子のオーバーロードやサブタイプ、型変換の使い方を説明します。
-=item L<Moose::Cookbook::Basics::Recipe11> - BUILDARGSとBUILDを使ってオブジェクトの生成に割り込む
+=item L<Moose::Cookbook::Basics::Recipe10> - BUILDARGSとBUILDを使ってオブジェクトの生成に割り込む
このレシピではC<BUILDARGS>とC<BUILD>を使ってオブジェクトの生成プロセスに割り込む方法を説明します。
-=item L<Moose::Cookbook::Basics::Recipe12> - Mooseを使っていないベースクラスを拡張する
+=item L<Moose::Cookbook::Basics::Recipe11> - Mooseを使っていないベースクラスを拡張する
このレシピでは、Mooseをいっさい利用していないL<DateTime>モジュールのサブクラスを、Mooseベースで作成します。
@@ -124,7 +120,7 @@ Mooseのアトリビュートメタクラスを拡張して機能を追加する
このレシピでは独自のメタインスタンスクラスを作成する例を紹介します。メタインスタンスというのはオブジェクトのインスタンスの内部構造を決定して、アトリビュートスロットへのアクセスを提供するものです。
-=item L<Moose::Cookbook::Meta::Recipe8> - 不変化に割り込む (TODO)
+=item Moose::Cookbook::Meta::Recipe8 - 不変化に割り込む (TODO)
Mooseには「不変化」という機能があります。クラス(アトリビュートやロールなど)を定義したあとでC<< __PACKAGE__->meta()->make_immutable() >>を呼ぶと、Mooseにオブジェクトの生成やアトリビュートのアクセスなどを最適化させることができます。
@@ -189,3 +185,5 @@ L<http://www.iinteractive.com>
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
+=cut
+
@@ -1,5 +1,7 @@
=encoding utf8
+=pod
+
=head1 題名
Moose::Cookbook::Basics::Recipe1 - (毎度おなじみ) B<Point>の例
@@ -183,3 +185,5 @@ L<http://www.iinteractive.com>
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
+=cut
+
@@ -1,228 +1,103 @@
=encoding utf8
+=pod
+
=head1 題名
-Moose::Cookbook::Basics::Recipe10 - 演算子のオーバーロード、サブタイプ、型変換
+Moose::Cookbook::Basics::Recipe10 - BUILDARGSとBUILDを使ってオブジェクトの生成に割り込む
=head1 概要
- package Human;
-
- use Moose;
- use Moose::Util::TypeConstraints;
-
- subtype 'Gender'
- => as 'Str'
- => where { $_ =~ m{^[mf]$}s };
-
- has 'gender' => ( is => 'ro', isa => 'Gender', required => 1 );
-
- has 'mother' => ( is => 'ro', isa => 'Human' );
- has 'father' => ( is => 'ro', isa => 'Human' );
+ package Person;
- use overload '+' => \&_overload_add, fallback => 1;
+ has 'ssn' => (
+ is => 'ro',
+ isa => 'Str',
+ predicate => 'has_ssn',
+ );
- sub _overload_add {
- my ( $one, $two ) = @_;
+ has 'country_of_residence' => (
+ is => 'ro',
+ isa => 'Str',
+ default => 'usa'
+ );
- die('Only male and female humans may create children')
- if ( $one->gender() eq $two->gender() );
+ has 'first_name' => (
+ is => 'ro',
+ isa => 'Str',
+ );
- my ( $mother, $father )
- = ( $one->gender eq 'f' ? ( $one, $two ) : ( $two, $one ) );
+ has 'last_name' => (
+ is => 'ro',
+ isa => 'Str',
+ );
- my $gender = 'f';
- $gender = 'm' if ( rand() >= 0.5 );
+ sub BUILDARGS {
+ my $class = shift;
- return Human->new(
- gender => $gender,
- mother => $mother,
- father => $father,
- );
+ if ( @_ == 1 && ! ref $_[0] ) {
+ return { ssn => $_[0] };
+ }
+ else {
+ return $class->SUPER::BUILDARGS(@_);
+ }
}
-=head1 本文
-
-このレシピでは演算子のオーバーロードや型変換、サブタイプを利用してヒトの繁殖システムを(まあ、少なくとも遺伝子の選択くらいは、ですが)再現する方法を紹介します。
-
-=head1 はじめに
-
-このC<Human>クラスでは演算子のオーバーロードを利用して2人のヒトを「加え」れば子供が産まれるようになっています(今回の実装では2つのオブジェクトは異なる性を持っている必要がありますが、ここで話題にしているのはあくまでも生物学的な繁殖の話であって、結婚の話ではありませんので、あしからず)。
-
-この例は、そのままでもよいのですが、遺伝子を加えてやればもっとおもしろいものになります。ここでは生物学のまねごとをするために目の色をコントロールする遺伝子を2つ加えて、オーバーロードを使って親から受け継いだ遺伝子を合成してみます。
-
-=head2 演算子のオーバーロードとは?
-
-オーバーロードはMoose特有の機能「ではありません」。PerlではC<overload>プラグマを使って実装されている一般的なオブジェクト指向のコンセプトです。オーバーロードを使うと、加算演算子(C<+>)のようにPerlの組み込み演算子とオブジェクトを組み合わせて使うとき、あるいはオブジェクトを文字列として扱うときに有意義な処理をさせられます。
-
-この例では、加算をオーバーロードして、C<$child = $mother + $father>のようなコードを書けるようにしています。
-
-=head1 遺伝子
-
-目の色に影響を与える遺伝子はたくさんありますが、もっとも重要なのはI<gey>とI<bey2>の2つです。ここではそれぞれの遺伝子にクラスを用意するところから始めましょう。
-
-=head2 Human::Gene::bey2
-
- package Human::Gene::bey2;
-
- use Moose;
- use Moose::Util::TypeConstraints;
-
- type 'bey2_color' => where { $_ =~ m{^(?:brown|blue)$} };
-
- has 'color' => ( is => 'ro', isa => 'bey2_color' );
-
-このクラスはたいしたことはありません。許される色についての型制約と、C<color>というアトリビュートがあるだけです。
-
-=head2 Human::Gene::gey
-
- package Human::Gene::gey;
-
- use Moose;
- use Moose::Util::TypeConstraints;
-
- type 'gey_color' => where { $_ =~ m{^(?:green|blue)$} };
-
- has 'color' => ( is => 'ro', isa => 'gey_color' );
-
-これもC<Humane::Gene::bey2>クラスとほとんど同じですが、許される色が異なっています。
-
-=head1 目の色
-
-C<Human>クラスに(それぞれの遺伝子について2つずつ)4つのアトリビュートを用意することもできますが、それではいささかごちゃごちゃしてしまいますので、かわりに遺伝子をC<Human::EyeColor>というコンテナクラスに入れて抽象化することにします。こうすると、C<Human>にはC<eye_color>というアトリビュートさえ用意しておけばよくなります。
-
- package Human::EyeColor;
+ sub BUILD {
+ my $self = shift;
- use Moose;
- use Moose::Util::TypeConstraints;
-
- coerce 'Human::Gene::bey2'
- => from 'Str'
- => via { Human::Gene::bey2->new( color => $_ ) };
-
- coerce 'Human::Gene::gey'
- => from 'Str'
- => via { Human::Gene::gey->new( color => $_ ) };
-
- has [qw( bey2_1 bey2_2 )] =>
- ( is => 'ro', isa => 'Human::Gene::bey2', coerce => 1 );
-
- has [qw( gey_1 gey_2 )] =>
- ( is => 'ro', isa => 'Human::Gene::gey', coerce => 1 );
-
-目の色をあらわすクラスには遺伝子がそれぞれ2つずつ用意されています。また、それぞれのクラスの型変換も用意して、文字列を新しいオブジェクトに変換できるようにしてあります。ただし、「indigo」のような文字列を変換しようとすると、型変換は失敗します。どちらの遺伝子もこの色を有効とは認めないためです。
-
-ついでながら、この例を見ると、C<has>の第1引数に名前の配列リファレンスを渡すと、同じアトリビュートを一度に複数個定義できるのがわかります。
-
-それから、遺伝子の組み合わせから実際の目の色を計算するメソッドが必要です。I<bey2>の茶色の遺伝子は青と緑の遺伝子より優性で、I<gey>の緑の遺伝子は青より優性です。
-
- sub color {
- my ($self) = @_;
-
- return 'brown'
- if ( $self->bey2_1->color() eq 'brown'
- or $self->bey2_2->color() eq 'brown' );
-
- return 'green'
- if ( $self->gey_1->color() eq 'green'
- or $self->gey_2->color() eq 'green' );
-
- return 'blue';
+ if ( $self->country_of_residence eq 'usa' ) {
+ die 'Cannot create a Person who lives in the USA without an ssn.'
+ unless $self->has_ssn;
+ }
}
-C<Human::EyeColor>オブジェクトは文字列としても扱えるようにしたいので、C<Human::EyeColor>クラスに文字列のオーバーロードを定義しましょう。
-
- use overload '""' => \&color, fallback => 1;
-
-最後に、加算のオーバーロードを定義する必要があります。これで、C<Human::EyeColor>オブジェクトを足しあわせると、新しい(遺伝子学的に正しい)目の色をした新しいC<Human::EyeColor>オブジェクトが得られるようになります。
+=head1 本文
- use overload '+' => \&_overload_add, fallback => 1;
+このレシピではC<BUILDARGS>とC<BUILD>の使い方を説明します。これらのメソッドを定義すると、C<new>をオーバーライドしなくてもオブジェクトの生成プロセスに割り込むことができます。
- sub _overload_add {
- my ( $one, $two ) = @_;
+C<BUILDARGS>メソッドが呼ばれるのはオブジェクトが生成される「前」です。これはクラスメソッドとして呼ばれ、C<new>メソッドに渡されるすべてのパラメータを受け取ります。C<BUILDARGS>メソッドはその引数に何らかの処理をして、ハッシュリファレンスを返すことが期待されています。ハッシュの各キーはアトリビュートのC<init_arg>でなければなりません。
- my $one_bey2 = 'bey2_' . _rand2();
- my $two_bey2 = 'bey2_' . _rand2();
+C<BUILDARGS>の主な目的は、クラスが名前付き引数以外のものを受け取れるようにすることです。このC<Person>クラスの場合は引数が社会保障番号ひとつだけでも呼べるようにしています。
- my $one_gey = 'gey_' . _rand2();
- my $two_gey = 'gey_' . _rand2();
+ my $person = Person->new('123-45-6789');
- return Human::EyeColor->new(
- bey2_1 => $one->$one_bey2->color(),
- bey2_2 => $two->$two_bey2->color(),
- gey_1 => $one->$one_gey->color(),
- gey_2 => $two->$two_gey->color(),
- );
- }
+今回のC<BUILDARGS>のポイントはこの条件文です。
- sub _rand2 {
- return 1 + int( rand(2) );
- }
+ if ( @_ == 1 && ! ref $_[0] ) {
+ return { ssn => $_[0] };
+ }
-目の色をあらわすオブジェクトを2つ足しあわせると、C<_overload_add()>メソッドに2つのC<Human::EyeColor>オブジェクトが渡され(C<+>演算子の左項と右項です)、新しいC<Human::EyeColor>オブジェクトが返ります
+Mooseのコンストラクタは、デフォルトではキーと値のペアからなるリストか、ハッシュリファレンスを受け取るようになっているので、リファレンスでないことを確認してからでないとC<$_[0]>が社会保障番号であると想定することはできません
-=head1 C<Human>に目の色を追加する
+C<< $class->SUPER::BUILDARGS(@_) >>を呼んでいるのは、それ以外のすべてのケースに対応するためです。自分でC<BUILDARGS>メソッドを実装する場合はかならずこのようにしておいてください。L<Moose::Object>にもハッシュリファレンスやキーと値のペアのリストを処理する独自のC<BUILDARGS>メソッドが用意されているためです。
-新しいC<Human::EyeColor>クラスは、もとのC<Human>クラスを何ヶ所か変更するだけで組み込むことができます
+C<BUILD>メソッドが呼ばれるのはオブジェクトが生成された「あと」、呼び出し元にオブジェクトを返す前です。C<BUILD>メソッドを使うと全体的なオブジェクトの状態をチェックできます。C<BUILD>メソッドは個々のアトリビュートの型制約だけでは表現できないロジックを入れておくのに便利です
- use List::MoreUtils qw( zip );
+C<Person>クラスの場合はC<ssn>とC<country_of_residence>という2つのアトリビュートの関係をチェックする必要があります。オブジェクトが論理的に首尾一貫していない場合は例外が発生します。
- coerce 'Human::EyeColor'
- => from 'ArrayRef'
- => via { my @genes = qw( bey2_1 bey2_2 gey_1 gey_2 );
- return Human::EyeColor->new( zip( @genes, @{$_} ) ); };
+=head1 検討課題
- has 'eye_color' => (
- is => 'ro',
- isa => 'Human::EyeColor',
- coerce => 1,
- required => 1,
- );
-
-また、C<Human>クラスのC<_overload_add()>も目の色に対応できるように修正する必要があります。
-
- return Human->new(
- gender => $gender,
- eye_color => ( $one->eye_color() + $two->eye_color() ),
- mother => $mother,
- father => $father,
- );
+このレシピではすべてのアトリビュートが読み取り専用なのでかなり単純になっていますが、C<country_of_residence>アトリビュートが設定可能だったら、新しい居住国がC<usa>だったときにC<ssn>が設定されているかチェックする必要が出てきます(このようなチェックはC<before>モディファイアを使えば実現できるかもしれません)。
=head1 まとめ
-ここで利用したオーバーロード、サブタイプ、型変換という3つのテクニックを組み合わせると強力なインタフェースを提供できます。
-
-オーバーロードの詳細についてはL<overload>プラグマのドキュメントをご覧ください。
-
-ここで作成したコードの全体をまとめて見たい場合はF<t/000_recipes/basics/010_genes.t>をご覧ください。
-
-=head1 次のステップ
-
-これが本物のプロジェクトだったとしたら、おそらく以下のようなものがほしくなるでしょう。
-
-=over 4
+これまで何度もMooseのクラスではC<new>をオーバーライドしないようにと言ってきました。このレシピでは、C<new>をオーバーライドしなくてもC<BUILDARGS>とC<BUILD>を使えばオブジェクトの生成に割り込めることを紹介しました。
-=item Crypt::Randomを使った高度なランダム化
-
-=item 身体的特徴用のベースクラス
-
-=item 遺伝子の突然変異
-
-=item 追加の身体的特徴
-
-=item 人工生命
-
-=back
+C<BUILDARGS>メソッドを使うと、Mooseに組み込まれているコンストラクタのパラメータ処理を拡張できます。C<BUILD>メソッドを使うと、オブジェクト生成後にオブジェクト全体にかかわる論理的な制約を実装できます。
=head1 作者
-Aran Clary Deltac <bluefeet@cpan.org>
-
Dave Rolsky E<lt>autarch@urth.orgE<gt>
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2009 by Infinity Interactive, Inc.
+
+L<http://www.iinteractive.com>
-This work is licensed under a Creative Commons Attribution 3.0 Unported License.
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
-License details are at: L<http://creativecommons.org/licenses/by/3.0/>
+=cut
Oops, something went wrong.

0 comments on commit 3ff70eb

Please sign in to comment.