=encoding utf-8

=head1 NAME / 名称

DBICx::Modeler::Generator::JA - DBIx::Class::SchemaとDBICx::Modelerの動的な生成

=head1 バージョン

この文書はL<DBICx::Modeler::Generator|DBICx::Modeler::Generator>のバージョンC<0.02>について記述しています。

=head1 概要

    use Orochi;

    my $container = Orochi->new;
    $container->inject_literal('/Class/application' => 'MyApp');
    $container->inject_literal('/Path/root' => 'examples');
    # ...
    $container->inject_class('DBICx::Modeler::Generator');
    $container->inject_class('DBICx::Modeler::Generator::Class');
    # ...
    my $generator = $container->get('/DBICx/Modeler/Generator');

    $generator->deploy_database;
    $generator->update_schemata;
    $generator->update_models;

    # 備考: 上記のコードの代わりにDBICx::Modeler::Generator::CLIを使いましょう。

=head1 解説

エンタープライズアプリケーションでは、上手なアーキテクチャーを考慮する必要があります。
特に、モデリングはアプリケーションの保守性に多大な影響を及ぼします。

そこで、L<DBICx::Modeler|DBICx::Modeler>を使ってスキーマとモデルのモジュールを分離することを推奨します。
この小気味よいモジュールは、L<DBIx::Class|DBIx::Class>スキーマに対して、L<Moose|Moose>に基づいたレイヤーを提供します。

しかしながら、その分離による恩恵を享受するためには、たくさんのモデルモジュールを定義しなければなりません。
これはとても面倒な作業です。

そこで、以下の機能を提供するこのC<DBICx::Modeler::Generator>モジュールによって、面倒な共通的定義を自動化しましょう。

=over 4

=item *

データベースの動的な配備

=item *

L<DBIx::Class|DBIx::Class>スキーマモジュール群の動的な定義

=item *

L<DBICx::Modeler|DBICx::Modeler>モデルモジュール群の動的な定義

=back

なお、このC<DBICx::Modeler::Generator>モジュールは、L<DBIx::Class::Schema::Loadler|DBIx::Class::Schema::Loadler>によるスキーマモジュール群の動的な生成を自動化する、単純なラッパーとしても使えます。

=head2 アプリケーションのモデリング方法 - 典型的な作業手順(ワークフロー)

=over 4

=item 1.

I<MySQL Workbench>アプリケーション(L<http://www.mysql.com/products/workbench/>)を使って、スキーマ群を定義します。

訳注: 日本語版ページはL<http://www-jp.mysql.com/products/workbench/>にあります。ただし、このアプリケーションの日本語版が存在するわけではありません。

このアプリケーションは表(テーブル), 列(カラム), 索引(インデックス), 関係(リレーション)などを設計出来ます。

スキーマファイルの実例(サンプル)は、このディストリビューションのF<examples/doc/DBDSC_schemata.mwb>に同梱されています。
これはL<DBICx::Modeler|DBICx::Modeler>のテスト用モジュール群を再現したもので、C<artist>, C<cd>, C<track>というテーブル(スキーマ)を備えています。

=item 2.

文書化のためのB<任意の作業として>、I<MySQL Workbench>を使ってER図(ERD: Entity-Relationship Diagram)を描画します。

ER図として出力した画像ファイルの実例(サンプル)は、このディストリビューションのF<examples/doc/DBDERII_Including_Information.png>に同梱されています。

=item 3.

I<MySQL Workbench>のC<< [Database] - [Forward Engineer...] >>機能を使って、スキーマからデータベースを動的に配備します。

もしくは、このモジュールのL<< deploy_database()メソッド|/$self->deploy_database() >>で、I<MySQL Workbench>のC<< [File] - [Export] - [Forward Engineer SQL CREATE Script...] >>機能によって生成したデータベース作成用スクリプト(データ定義言語, DDL: Data Definition Language)を使って配備します。

生成したデータベース作成用スクリプトの実例(サンプル)は、このディストリビューションのF<examples/src/myapp_mysql.sql>(MySQL用)やF<examples/src/myapp.sql>(SQLite用)に同梱されています。

注: I<MySQL Workbench>はI<SQLite export plugin for MySQL Workbench>プラグイン(L<http://www.henlich.de/software/sqlite-export-plugin-for-mysql-workbench/>)によってSQLite用のDDLスクリプトを出力することが出来ます。

=item 4.

追加の定義が必要なスキーマモジュール群を静的に定義します(自分で書くということです)。
追加の定義とは、インフレーション(inflations: データベースから取り出す際にオブジェクト化する処理など), デフレーション(deflations: データベースへ格納する際にオブジェクトを文字列化する処理など), 関係(relationships)などです。

追加の定義のみを記述したスキーマモジュールファイルの実例は、このディストリビューションのF<examples/src/lib/MyApp/Schema/Artist.pm>に同梱されています。

=item 5.

このモジュールのL<< update_schemata()メソッド|/$self->update_schemata() >>を使って、スキーマモジュールファイル群を動的に生成します。

これによって、例えばこのディストリビューションのF<examples/lib/MyApp/Schema/Artist.pm>やF<examples/lib/MyApp/Schema/Cd.pm>等々にスキーマファイルを生成することが出来ます。

=item 6.

追加の定義が必要なモデルモジュール群を静的に定義します(自分で書くということです)。

追加の定義とは、L<Moose|Moose>のアトリビュート(attributes), メソッド(methods), メソッドモディファイヤー(method modifiers)などです。

追加の定義のみを記述したモデルモジュールファイルの実例は、このディストリビューションのF<examples/src/lib/MyApp/Model/Cd.pm>に同梱されています。

=item 7.

このモジュールのL<< update_models()メソッド|/$self->update_models() >>を使って、モデルモジュール群を動的に生成します。

これによって、例えばこのディストリビューションのF<examples/lib/MyApp/Model/Artist.pm>やF<examples/lib/MyApp/Model/Cd.pm>等々にモデルファイルを生成することが出来ます。

=back

=head2 モデリングの秘訣

=head3 バッチスクリプトの使用

データベースの動的な配備, スキーマ群の動的な定義, モデル群の動的な定義を行うバッチスクリプトを使用することを推奨します。

バッチスクリプトファイルの実例(サンプル)は、このディストリビューションのF<examples/src/sbin/maintain_models.pl>に同梱されています。
実行方法はL<見本|/見本>節を参照してください。

=head3 出力した画像の寸法を揃える方法

I<MySQL Workbench>では、ER図の1mmは出力されるPNG画像の5pxに相当します(これはWindows版のバージョン5.1.18 OSS時点での前提です)。

この情報に基づくと、PNG画像の寸法を指定することが出来ます。

例えば、Quad-VGA解像度(幅: 1280px, 高さ: 960px)として出力するために、以下のような設定を施してはいかがでしょうか:

=over 4

=item C<< [Paper] >>グループ

C<< [Size] >>リストボックスでC<< [A4 (210 mm x 297 mm)] >>アイテムを選択

=item C<< [Orientation] >>グループ

C<< [Landscape] >>ラジオボタンをオンにする

=item C<< [Margins] >>グループ

C<< [Top] >>テキストボックスへC<< [10] >>mmを入力

C<< [Left] >>テキストボックスへC<< [10] >>mmを入力

C<< [Bottom] >>テキストボックスへC<< [35] >>mmを入力

C<< [Right] >>テキストボックスへC<< [12] >>mmを入力

=back

ご参考までに、サイズ検証スクリプトファイルの実例(サンプル)は、このディストリビューションのF<examples/src/confirm_image_size.pl>として同梱されています。

=head1 メソッド

=head2 コンストラクター

=head3 C<< $di_container->get('/DBICx/Modeler/Generator') >>

依存性が注入されたオブジェクトを返します。

オブジェクトを取得するためには、C<< DBICx::Modeler::Generator->new(...) >>の代わりに上記のL<概要|/概要>にあるコードを使ってください。

詳細はL<依存性の注入|/依存性の注入>節を参照してください。

L<DBICx::Modeler::Generator::CLI|DBICx::Modeler::Generator::CLI>によって依存性の注入を包み込んだインターフェースを使うことも出来ます。

=head3 C<< DBICx::Modeler::Generator::CLI->new_with_options(%init_args) >>

L<DBICx::Modeler::Generator::CLI|DBICx::Modeler::Generator::CLI>オブジェクトを返します。

ジェネレーターオブジェクトを取得するためには、このインターフェースを使うことをB<強く>推奨します。L<MooseX::Getopt|MooseX::Getopt>とL<MooseX::SimpleConfig|MooseX::SimpleConfig>を用いて依存性の注入作業を包み込むことが出来るためです。

以下の具体的なコードを参照してください:

    my $generator = DBICx::Modeler::Generator::CLI->new_with_options(
        application => 'MyApp',
        root        => '/path/to/root',
        driver      => 'SQLite',
    )->generator;

=head2 機能

=head3 C<< $self->deploy_database() >>

データベース作成用スクリプトに基づいてデータベースを配備します。

=head3 C<< $self->update_models() >>

モデルモジュール群を更新します。

=head3 C<< $self->update_schemata() >>

スキーマモジュール群を更新します。

=head1 依存性の注入

このクラスとそのサブクラスでは依存性の注入(DI: Dependency Injection)のためにL<MooseX::Orochi|MooseX::Orochi>を使っています。

詳細はこのディストリビューションに同梱されているF<examples/src/sbin/maintain_models.pl>を参照してください。

=head2 必須の依存

=head3 C<< /DBICx/Modeler/Generator/Class >>

L<DBICx::Modeler::Generator::ClassLike|DBICx::Modeler::Generator::ClassLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::Class|DBICx::Modeler::Generator::Driver::Class>を同梱しています。

=head3 C<< /DBICx/Modeler/Generator/Class/application >>

アプリケーションルートクラスのクラス名です。

=over 4

=item 型(Type)

C<< Str >>

=item 用例(Example)

C<< MyApp >>, C<< My::App >>, 等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver >>

L<DBICx::Modeler::Generator::DriverLike|DBICx::Modeler::Generator::DriverLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::MySQL|DBICx::Modeler::Generator::Driver::MySQL>とL<DBICx::Modeler::Generator::Driver::SQLite|DBICx::Modeler::Generator::Driver::SQLite>を同梱しています。

=head3 C<< /DBICx/Modeler/Generator/Model >>

L<DBICx::Modeler::Generator::ModelLike|DBICx::Modeler::Generator::ModelLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::Model|DBICx::Modeler::Generator::Driver::Model>を同梱しています。

=head3 C<< /DBICx/Modeler/Generator/Path >>

L<DBICx::Modeler::Generator::PathLike|DBICx::Modeler::Generator::PathLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::Path|DBICx::Modeler::Generator::Driver::Path>を同梱しています。

=head3 C<< /DBICx/Modeler/Generator/Path/root >>

アプリケーションルートディレクトリーのパスです。

=over 4

=item 型(Type)

L<Path::Class::Dir|Path::Class::Dir>
(L<MooseX::Types::Path::Class|MooseX::Types::Path::Class>で型変換されます)

=item 用例(Example)

F<< /path/to/root >>

=back

=head3 C<< /DBICx/Modeler/Generator/Schema >>

L<DBICx::Modeler::Generator::SchemaLike|DBICx::Modeler::Generator::SchemaLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::Schema|DBICx::Modeler::Generator::Driver::Schema>を同梱しています。

=head3 C<< /DBICx/Modeler/Generator/Tree >>

L<DBICx::Modeler::Generator::TreeLike|DBICx::Modeler::Generator::TreeLike>インターフェースを満たす実装クラスのインスタンスです。

このディストリビューションでは、一般的な用途に使える実装クラスとして、L<DBICx::Modeler::Generator::Driver::Tree|DBICx::Modeler::Generator::Driver::Tree>を同梱しています。

=head2 任意の依存

=head3 C<< /DBICx/Modeler/Generator/Class/base_part >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< Base >>

=back

=head3 C<< /DBICx/Modeler/Generator/Class/model_part >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< Model >>

=back

=head3 C<< /DBICx/Modeler/Generator/Class/schema_part >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< Schema >>

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/bin >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< mysql >>
(ドライバーの実装クラスがL<DBICx::Modeler::Generator::Driver::MySQL|DBICx::Modeler::Generator::Driver::MySQL>の場合),
C<< sqlite3 >>
(ドライバーの実装クラスがL<DBICx::Modeler::Generator::Driver::SQLite|DBICx::Modeler::Generator::Driver::SQLite>の場合),
等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/database >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< $application >>, C<< /$root/$application.$database_extension >>, 等

=item 用例(Example)

C<< myapp >>, C<< my_app >>, F<< /path/to/root/my_app.db >>, 等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/dbd >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< mysql >>
(ドライバーの実装クラスがL<DBICx::Modeler::Generator::Driver::MySQL|DBICx::Modeler::Generator::Driver::MySQL>の場合),
C<< SQLite >>
(ドライバーの実装クラスがL<DBICx::Modeler::Generator::Driver::SQLite|DBICx::Modeler::Generator::Driver::SQLite>の場合),
等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/dsn >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< dbi:$dbd:database=$database >>,
C<< dbi:$dbd:database=$database;host=$host >>,
C<< dbi:$dbd:database=$database;host=$host;port=$port >>,
C<< dbi:$dbd:dbname=$database >>,
等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/extension >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

F<< .dbl >>
(ドライバーの実装クラスがL<DBICx::Modeler::Generator::Driver::SQLite|DBICx::Modeler::Generator::Driver::SQLite>の場合),
等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/host >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< undef >> (これは大抵のドライバーではC<< localhost >>を意味します)

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/password >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< undef >>

=item 用例(Example)

C<< foobar >>

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/port >>

=over 4

=item 型(Type)

C<< Int >>

=item 用例(Example)

C<< 3306 >>, C<< 3307 >>, 等

=back

=head3 C<< /DBICx/Modeler/Generator/Driver/username >>

=over 4

=item 型(Type)

C<< Str >>

=item 用例(Example)

C<< mysql_user >>

=back

=head3 C<< /DBICx/Modeler/Generator/Path/creation_script >>

=over 4

=item 型(Type)

L<Path::Class::File|Path::Class::File>
(L<MooseX::Types::Path::Class|MooseX::Types::Path::Class>で型変換されます)

=item 初期値(Default)

C<< /$root/$source/$application.$script_extension >>

=item 用例(Example)

F<< /path/to/root/src/myapp.sql >>

=back

=head3 C<< /DBICx/Modeler/Generator/Path/module_extension >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

F<< .pm >>

=back

=head3 C<< /DBICx/Modeler/Generator/Path/script_extension >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

F<< .sql >>

=back

=head3 C<< /DBICx/Modeler/Generator/Schema/components >>

=over 4

=item 型(Type)

C<< ArrayRef[Str] >>

=item 初期値(Default)

C<< [] >>

(I<Don't use DBIx::Class::UTF8Columns>,
L<http://perl-users.jp/articles/advent-calendar/2009/hacker/04.html>も参照)

=back

=head3 C<< /DBICx/Modeler/Generator/Schema/is_debug >>

=over 4

=item 型(Type)

C<< Bool >>

=item 初期値(Default)

C<< 0 >> (false)

=back

=head3 C<< /DBICx/Modeler/Generator/Tree/application >>

=over 4

=item 型(Type)

C<< Str >>

=item 初期値(Default)

C<< myapp >> (アプリケーションクラス名がC<< MyApp >>の場合),
C<< my_app >> (アプリケーションクラス名がC<< My::App >>の場合),
等

=back

=head3 C<< /DBICx/Modeler/Generator/Tree/library >>

=over 4

=item 型(Type)

C<< ArrayRef[Str] >>

=item 初期値(Default)

C<< [qw(lib)] >>

=back

=head3 C<< /DBICx/Modeler/Generator/Tree/source >>

=over 4

=item 型(Type)

C<< ArrayRef[Str] >>

=item 初期値(Default)

C<< [qw(src)] >>

=back

=head3 C<< /DBICx/Modeler/Generator/Tree/target >>

=over 4

=item 型(Type)

C<< ArrayRef[Str] >>

=item 初期値(Default)

C<< [] >>

=back

=head1 見本

このディストリビューションでは、上記のL<作業手順(ワークフロー)|/アプリケーションのモデリング方法 - 典型的な作業手順(ワークフロー)>に関する一切のファイルを、見本として同梱しています。

ディストリビューションのルートディレクトリーで、以下のコマンドを実行してください:

    perl -Ilib examples/src/sbin/maintain_models.pl \
         -a MyApp -r examples -d SQLite

または

    perl -Ilib examples/src/sbin/maintain_models.pl            \
         -a MyApp -r examples -d MySQL -u username -w password \
         -l /Path/script_extension=_mysql.sql

または

    perl -Ilib examples/src/sbin/maintain_models.pl \
         --configfile examples/src/myapp.yml

=head1 関連情報

=over 4

=item *

L<DBICx::Modeler|DBICx::Modeler>

=item *

L<DBIx::Class::Schema::Loader|DBIx::Class::Schema::Loader>

=item *

L<DBIx::Class|DBIx::Class>

=item *

I<MySQL Workbench>アプリケーションのホームページ,
L<http://www.mysql.com/products/workbench/>

訳注: 日本語版ページはL<http://www-jp.mysql.com/products/workbench/>にあります。ただし、このアプリケーションの日本語版が存在するわけではありません。

=item *

Martin Fowler,
I<Patterns of Enterprise Application Architecture>,
Toronto: Addison-Wesley Professional,
2002,
560p.,
ISBN 0321127420 / 978-0321127426

(PoEAA, PofEAAとして略されます)

訳注: 翻訳内容に対して色々な意見があるようですが、ともあれ日本語版が刊行されています。

マーチン=ファウラー(著),
長瀬 嘉秀(監訳),
株式会社テクノロジックアート(翻訳),
『I<(Object Oriented Selection) エンタープライズアプリケーションアーキテクチャパターン>』,
東京: 翔泳社,
2005年,
548ページ,
ISBN 4798105538 / 978-4798105536

=item *

I<エンタープライズアプリケーションに於いてスキーマとモデルを分離する方法>,
L<http://blog.eorzea.asia/2009/10/post_76.html>

=back

=head1 今後の予定

=over 4

=item *

テストの拡充

=item *

テストでのL<Test::mysqld|Test::mysqld>の使用
(参考: 牧 大輔さん(lestrratさん)による、L<http://mt.endeworks.jp/d-6/2009/10/things-ive-done-while-using-test-mysqld.html>の記事)

=back

=head1 非互換性

互換性のない変更点はありません。

=head1 バグと制約事項

バグは報告されていません。

=head2 提案やバグ報告の方法

何かバグを発見されたら、機能のご要望がありましたら、または改善のためのご意見がありましたら、メール(C<bug-dbicx-modeler-generator at rt.cpan.org>宛)で報告してください。
または、Webインターフェース(L<http://rt.cpan.org/Public/Bug/Report.html?Queue=DBICx-Modeler-Generator>)を使って報告してください。
これによって、その報告内容が開発者へ通知されます。
さらに、バグや要望の対応状況について、報告者が通知を自動的に受けることも出来ます。

バグを報告いただく際には、もし可能であれば、バグを再現するための出来るだけ少量のサンプルコードを添えてください。
提案やパッチは勿論歓迎します。

=head1 サポート

このモジュールの文書はC<perldoc>コマンドで閲覧出来ます。

    perldoc DBICx::Modeler::Generator

日本語版はL<Pod::PerldocJp|Pod::PerldocJp>を使ったC<perldocjp>コマンドで閲覧出来ます。

    perldocjp DBICx::Modeler::Generator.ja

また、以下の場所も参照してください:

=over 4

=item RT: CPAN's request tracker

L<http://rt.cpan.org/Public/Dist/Display.html?Name=DBICx-Modeler-Generator>

=item AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/DBICx-Modeler-Generator>

=item Search CPAN

L<http://search.cpan.org/dist/DBICx-Modeler-Generator>

=item CPAN Ratings

L<http://cpanratings.perl.org/dist/DBICx-Modeler-Generator>

=back

=head1 バージョン管理

このモジュールはI<git>を使って保守されています。

最新版はL<git://github.com/gardejo/p5-dbicx-modeler-generator.git>にあります。

=head1 コード網羅率

テストのコード網羅率(コードカバレッジ)を検査するために、L<Devel::Cover|Devel::Cover>を使っています。
このディストリビューションのテストスートに関するC<Devel::Cover>による調査結果の概要を以下に示します。

 ---------------------------- ------ ------ ------ ------ ------ ------ ------
 File                           stmt   bran   cond    sub    pod   time  total
 ---------------------------- ------ ------ ------ ------ ------ ------ ------
 ...BICx/Modeler/Generator.pm  100.0    n/a    n/a  100.0  100.0    0.0  100.0
 .../Modeler/Generator/CLI.pm  100.0  100.0    n/a  100.0    0.0   22.2   98.0
 ...odeler/Generator/Class.pm  100.0    n/a    n/a  100.0  100.0    0.0  100.0
 ...er/Generator/ClassLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 .../Generator/Driver/Base.pm  100.0  100.0    n/a  100.0  100.0    0.0  100.0
 ...Generator/Driver/MySQL.pm  100.0  100.0    n/a  100.0    n/a    0.0  100.0
 ...enerator/Driver/SQLite.pm  100.0    n/a    n/a  100.0    n/a   11.1  100.0
 ...r/Generator/DriverLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 ...odeler/Generator/Model.pm  100.0  100.0    n/a  100.0  100.0   44.4  100.0
 ...er/Generator/ModelLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 ...Modeler/Generator/Path.pm  100.0  100.0    n/a  100.0  100.0    0.0  100.0
 ...ler/Generator/PathLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 ...deler/Generator/Schema.pm  100.0   50.0    n/a  100.0  100.0   22.2   97.6
 ...r/Generator/SchemaLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 ...Modeler/Generator/Tree.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 ...ler/Generator/TreeLike.pm  100.0    n/a    n/a  100.0    n/a    0.0  100.0
 Total                         100.0   94.4    n/a  100.0   91.7  100.0   99.7
 ---------------------------- ------ ------ ------ ------ ------ ------ ------

=head1 著者

=over 4

=item 守屋 雅樹 (Gardejo) (en: MORIYA Masaki, alias Gardejo)

C<< <moriya at cpan dot org> >>,
L<http://gardejo.org/>

=back

=head2 訳註: 訳者

=over 4

=item 守屋 雅樹 (Gardejo) (en: MORIYA Masaki, alias Gardejo)

C<< <moriya at cpan dot org> >>,
L<http://gardejo.org/>

=back

=head1 著作権と使用許諾条件

著作権保有 (c) 2009-2010 守屋 雅樹 (Gardejo)

このモジュールはフリーソフトウェアです。
あなたはこれをPerlと同じように自由に再配布・改変することが出来ます。
詳しくはL<perlgpl|perlgpl>およびL<perlartistic|perlartistic>を参照してください。

使用許諾条件の全文はこのディストリビューションに同梱されているF<LICENSE>ファイルにあります。

=head2 訳註: 著作権と使用許諾条件の原文

Copyright (c) 2009-2010 MORIYA Masaki, alias Gardejo

This module is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.
See L<perlgpl|perlgpl> and L<perlartistic|perlartistic>.

The full text of the license can be found in the F<LICENSE> file
included with this distribution.

=head1 訳注

=over 4

=item 音引き

この文書の訳出にあたっては、英単語のカタカナ表記について、語尾の音引き(katakana prolonged sound mark)を省かずに表記しています(JIS Z 8301で規定されているような省略はしていません)。
例えば、「constructor」を「コンストラクB<タ>」ではなく「コンストラクB<ター>」と表記しています。

=back

=cut
