<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.codegenerator.reference">
    <title>Zend_CodeGenerator リファレンス</title>

    <sect2 id="zend.codegenerator.reference.abstracts">
        <title>抽象クラスとインターフェース</title>

        <sect3 id="zend.codegenerator.reference.abstracts.abstract">
            <title>Zend_CodeGenerator_Abstract</title>

            <para>
                すべての CodeGenerator クラスが継承する基底のクラスは、
                必要な最小限の機能性を提供します。
                その<acronym>API</acronym>は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
abstract class Zend_CodeGenerator_Abstract
{
    final public function __construct(Array $options = array())
    public function setOptions(Array $options)
    public function setSourceContent($sourceContent)
    public function getSourceContent()
    protected function _init()
    protected function _prepare()
    abstract public function generate();
    final public function __toString()
}
]]></programlisting>

            <para>
                コンストラクタは最初に <methodname>_init()</methodname> を呼び出します。
                （それは、具体的に拡張するクラスを実装するために空のままにされます）
                それから <methodname>setOptions()</methodname> に <varname>$options</varname> パラメータを渡し、
                最後に <methodname>_prepare()</methodname> を呼び出します。
                （<!-- TODO -->again, 
                クラスの拡張によって実装されます。）
            </para>

            <para>
                Zend Framework のほとんどのクラスのように、
                <methodname>setOptions()</methodname> ではクラスの既存のセッターへのオプション・キーを比較して、
                見つかったら、メソッドに値を渡します。
            </para>

            <para>
                <methodname>__toString()</methodname> は最後に指定され、
                <methodname>generate()</methodname> の代わりをします。
            </para>

            <para>
                <methodname>setSourceContent()</methodname> 及び <methodname>getSourceContent()</methodname> は
                デフォルト・コンテンツを生成されたコードに設定するか、
                一旦すべての生成作業が完了した前述のコンテンツと入れ替えることを目的とします。
            </para>
        </sect3>

        <sect3 id="zend.codegenerator.reference.abstracts.php-abstract">
            <title>Zend_CodeGenerator_Php_Abstract</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Abstract</classname> は
                <classname>Zend_CodeGenerator_Abstract</classname> を拡張し、
                生成されたコンテンツの前に現れなければならないインデントの量だけでなく、
                コンテンツが変わったかどうか追跡するための若干のプロパティも加えます。
                その <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
abstract class Zend_CodeGenerator_Php_Abstract
    extends Zend_CodeGenerator_Abstract
{
    public function setSourceDirty($isSourceDirty = true)
    public function isSourceDirty()
    public function setIndentation($indentation)
    public function getIndentation()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.abstracts.php-member-abstract">
            <title>Zend_CodeGenerator_Php_Member_Abstract</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Member_Abstract</classname> は
                クラスのメンバー - プロパティとメソッド - を生成するための基底クラスで、
                可視性を確立するためのアクセッサとミューテータを提供します;
                メンバーやメンバー名が abstract 、 static または final のいずれにせよ。
                その <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
abstract class Zend_CodeGenerator_Php_Member_Abstract
    extends Zend_CodeGenerator_Php_Abstract
{
    public function setAbstract($isAbstract)
    public function isAbstract()
    public function setStatic($isStatic)
    public function isStatic()
    public function setVisibility($visibility)
    public function getVisibility()
    public function setName($name)
    public function getName()
}
]]></programlisting>
        </sect3>
    </sect2>

    <sect2 id="zend.codegenerator.reference.concrete">
        <title>CodeGenerator クラスを確立</title>

        <sect3 id="zend.codegenerator.reference.concrete.php-body">
            <title>Zend_CodeGenerator_Php_Body</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Body</classname> は、
                ファイルの中に含む任意の手続き的なコードを生成することを目的とします。
                そのように、単にコンテンツをオブジェクトに設定し、
                <methodname>generate()</methodname> を実施すると、それはそのコンテンツを返します。
            </para>

            <para>
            
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Body extends Zend_CodeGenerator_Php_Abstract
{
    public function setContent($content)
    public function getContent()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-class">
            <title>Zend_CodeGenerator_Php_Class</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Class</classname> は、
                <acronym>PHP</acronym> クラスを生成することを目的とします。
                基本的機能では <acronym>PHP</acronym> クラスそのものを生成し、
                また、任意で関連した <acronym>PHP</acronym> DocBlockも生成します。
                クラスは他のクラスを実装するかもしれませんし、継承するかもしれません。
                またはabstractと指定されるかもしれません。
                他のコード・ジェネレーター・クラスを利用して、
                クラスの定数やプロパティ、メソッドを付与することもできます。
            </para>

            <para>
                その <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Class $reflectionClass
    )
    public function setDocblock(Zend_CodeGenerator_Php_Docblock $docblock)
    public function getDocblock()
    public function setName($name)
    public function getName()
    public function setAbstract($isAbstract)
    public function isAbstract()
    public function setExtendedClass($extendedClass)
    public function getExtendedClass()
    public function setImplementedInterfaces(Array $implementedInterfaces)
    public function getImplementedInterfaces()
    public function setProperties(Array $properties)
    public function setProperty($property)
    public function getProperties()
    public function getProperty($propertyName)
    public function setMethods(Array $methods)
    public function setMethod($method)
    public function getMethods()
    public function getMethod($methodName)
    public function hasMethod($methodName)
    public function isSourceDirty()
    public function generate()
}
]]></programlisting>

            <para>
                <methodname>setProperty()</methodname> メソッドは、
                <classname>Zend_CodeGenerator_Php_Property</classname> インスタンスを生成するために
                用いられるかもしれない情報の配列、
                またはただ単に <classname>Zend_CodeGenerator_Php_Property</classname> インスタンス、
                を受け入れます。
                同様に <methodname>setMethod()</methodname> は、
                <classname>Zend_CodeGenerator_Php_Method</classname> インスタンスを生成するための、
                情報の配列またはそのクラスの具体化したインスタンスを受け入れます。
            </para>

            <para>
                <methodname>setDocBlock()</methodname> が <classname>Zend_CodeGenerator_Php_DocBlock</classname> の
                インスタンスを期待することも注意してください。
            </para>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-docblock">
            <title>Zend_CodeGenerator_Php_Docblock</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Docblock</classname> は、
                すべての標準的な docblock 機能を含む任意の <acronym>PHP</acronym> docblock を生成することで使用できます:
                短い、または長い説明や注釈タグ。
            </para>

            <para>
                注釈タグは <methodname>setTag()</methodname> や <methodname>setTags()</methodname> メソッドを用いてセットされるかもしれません;
                これらは <classname>Zend_CodeGenerator_Php_Docblock_Tag</classname> コンストラクタに渡されるかもしれないタグを記述している配列、
                またはそのクラスのインスタンスどちらもそれぞれ
                <!-- TODO -->take
            </para>

            <para>
                その <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Docblock $reflectionDocblock
    )
    public function setShortDescription($shortDescription)
    public function getShortDescription()
    public function setLongDescription($longDescription)
    public function getLongDescription()
    public function setTags(Array $tags)
    public function setTag($tag)
    public function getTags()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-docblock-tag">
            <title>Zend_CodeGenerator_Php_Docblock_Tag</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Docblock_Tag</classname> は、
                <acronym>PHP</acronym> docblock に含む任意の注釈タグを作成することを目的とします。
                タグは、名前（＠記号にすぐ続く部分）と説明（タグ名に続いているすべて）を含むことになっています。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Docblock_Tag
    extends Zend_CodeGenerator_Php_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Docblock_Tag $reflectionTag
    )
    public function setName($name)
    public function getName()
    public function setDescription($description)
    public function getDescription()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-docblock-tag-param">
            <title>Zend_CodeGenerator_Php_DocBlock_Tag_Param</title>

            <para>
                <classname>Zend_CodeGenerator_Php_DocBlock_Tag_Param</classname> は
                <classname>Zend_CodeGenerator_Php_DocBlock_Tag</classname> の分化したバージョンで、
                メソッド・パラメータを表します。
                そこで、タグ名は( "param" )として知られています、
                しかし、この注釈タグを構成するパラメータ名とデータ型を生成するために、
                追加の情報が必要とされます。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Docblock_Tag_Param
    extends Zend_CodeGenerator_Php_Docblock_Tag
{
    public static function fromReflection(
        Zend_Reflection_Docblock_Tag $reflectionTagParam
    )
    public function setDatatype($datatype)
    public function getDatatype()
    public function setParamName($paramName)
    public function getParamName()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-docblock-tag-return">
            <title>Zend_CodeGenerator_Php_DocBlock_Tag_Return</title>

            <para>
                param docblock <!-- TODO -->tag variant のように、
                <classname>Zend_CodeGenerator_Php_Docblock_Tab_Return</classname> は
                メソッドの戻り値を表すための注釈 <!-- TODO -->tag variantです。
                この場合、注釈タグ名は( "return" )として知られていますが、戻す型を必要とします。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Docblock_Tag_Param
    extends Zend_CodeGenerator_Php_Docblock_Tag
{
    public static function fromReflection(
        Zend_Reflection_Docblock_Tag $reflectionTagReturn
    )
    public function setDatatype($datatype)
    public function getDatatype()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-file">
            <title>Zend_CodeGenerator_Php_File</title>

            <para>
                <classname>Zend_CodeGenerator_Php_File</classname> は、
                <acronym>PHP</acronym> コードを含むファイルの完全なコンテンツを生成することに使われます。
                ファイル・レベルの docblock と同様に必要に応じて、
                ファイルはクラスまたは任意の <acronym>PHP</acronym> コードを含むかもしれません。
            </para>

            <para>
                クラスをファイルに加えるとき、
                <classname>Zend_CodeGenerator_Php_Class</classname> コンストラクタに渡す情報の配列か、
                そのクラスのインスタンスのどちらかを渡す必要があります。
                同様に docblock で、 <classname>Zend_CodeGenerator_Php_Docblock</classname> コンストラクタが消費する情報、
                またはクラスのインスタンスを渡す必要があります。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract
{
    public static function fromReflectedFilePath(
        $filePath,
        $usePreviousCodeGeneratorIfItExists = true,
        $includeIfNotAlreadyIncluded = true)
    public static function fromReflection(Zend_Reflection_File $reflectionFile)
    public function setDocblock(Zend_CodeGenerator_Php_Docblock $docblock)
    public function getDocblock()
    public function setRequiredFiles($requiredFiles)
    public function getRequiredFiles()
    public function setClasses(Array $classes)
    public function getClass($name = null)
    public function setClass($class)
    public function setFilename($filename)
    public function getFilename()
    public function getClasses()
    public function setBody($body)
    public function getBody()
    public function isSourceDirty()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-member-container">
            <title>Zend_CodeGenerator_Php_Member_Container</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Member_Container</classname> は、
                <classname>Zend_CodeGenerator_Php_Class</classname> によって、
                内部的にクラスのメンバー - プロパティやメソッドなど - の経過を追う目的に使われます。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Member_Container extends ArrayObject
{
    public function __construct($type = self::TYPE_PROPERTY)
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-method">
            <title>Zend_CodeGenerator_Php_Method</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Method</classname> は、
                クラス・メソッドを記述して、
                メソッドのためにコードと docblock を生成できます。
                その親クラス、 <classname>Zend_CodeGenerator_Php_Member_Abstract</classname> の通りに、
                static 、 abstract または final としての可視性と状態が指示されるかもしれません。
                最後に、メソッドのパラメータと戻り値は、指定されるかもしれません。
            </para>

            <para>
                パラメータは <methodname>setParameter()</methodname> または <methodname>setParameters()</methodname> を用いて設定されるかもしれません。
                それぞれの場合、パラメータは <classname>Zend_CodeGenerator_Php_Parameter</classname> コンストラクタに渡す情報の配列か、
                またはそのクラスのインスタンスでなければいけません。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Method
    extends Zend_CodeGenerator_Php_Member_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Method $reflectionMethod
    )
    public function setDocblock(Zend_CodeGenerator_Php_Docblock $docblock)
    public function getDocblock()
    public function setFinal($isFinal)
    public function setParameters(Array $parameters)
    public function setParameter($parameter)
    public function getParameters()
    public function setBody($body)
    public function getBody()
    public function generate()
}
]]></programlisting>
        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-parameter">
            <title>Zend_CodeGenerator_Php_Parameter</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Parameter</classname> は、
                メソッドのパラメータを指定することに使われるかもしれません。
                各々のパラメータは、位置やデフォルト値、データ型を持つかもしれません;
                パラメータ名は必須です。
                位置がもし明確でなければ、それらがメソッドで記載された順序が使われます。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Parameter $reflectionParameter
    )
    public function setType($type)
    public function getType()
    public function setName($name)
    public function getName()
    public function setDefaultValue($defaultValue)
    public function getDefaultValue()
    public function setPosition($position)
    public function getPosition()
    public function getPassedByReference()
    public function setPassedByReference($passedByReference)
    public function generate()
}
]]></programlisting>

            <para>
                既定値として <constant>NULL</constant> 、ブーリアンまたは配列を設定しようとすると、
                いくつかの問題が起きるかもしれません。
                このために、バリューホルダー・オブジェクト
                <classname>Zend_CodeGenerator_Php_ParameterDefaultValue</classname>
                を利用できます。例えば:
            </para>

            <programlisting language="php"><![CDATA[
$parameter = new Zend_CodeGenerator_Php_Parameter();
$parameter->setDefaultValue(
    new Zend_CodeGenerator_Php_Parameter_DefaultValue("null")
);
$parameter->setDefaultValue(
    new Zend_CodeGenerator_Php_Parameter_DefaultValue("array('foo', 'bar')")
);
]]></programlisting>

            <para>
                内部的には <methodname>setDefaultValue()</methodname> も
                <acronym>PHP</acronym> で表現できない値をバリューホルダーに変換します。
            </para>

        </sect3>

        <sect3 id="zend.codegenerator.reference.concrete.php-property">
            <title>Zend_CodeGenerator_Php_Property</title>

            <para>
                <classname>Zend_CodeGenerator_Php_Property</classname> はクラスのプロパティを記述します。
                それは定数か変数であるかもしれません。
                どちらの場合も、プロパティには関連するデフォルト値をオプションで持つかもしれません。
                さらに、親クラス（ <classname>Zend_CodeGenerator_Php_Member_Abstract</classname> ）を通じて
                変数のプロパティの可視性が設定されるかもしれません。
            </para>

            <para>
                そのクラスの <acronym>API</acronym> は下記の通りです。:
            </para>

            <programlisting language="php"><![CDATA[
class Zend_CodeGenerator_Php_Property
    extends Zend_CodeGenerator_Php_Member_Abstract
{
    public static function fromReflection(
        Zend_Reflection_Property $reflectionProperty
    )
    public function setConst($const)
    public function isConst()
    public function setDefaultValue($defaultValue)
    public function getDefaultValue()
    public function generate()
}
]]></programlisting>
        </sect3>
    </sect2>
</sect1>
