<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 24249 -->
    <!-- Reviewed: no -->
<sect1 id="zend.codegenerator.introduction">
    <title>Introducción</title>

    <para>
        <classname>Zend_CodeGenerator</classname>
        ofrece facilidades para
        generar código arbitrario usando una interfaz orientada a objetos,
        tanto
        para crear código nuevo como para actualizar código existente.
        Mientras que la
        implementación actual se limita a generar código
        <acronym>PHP</acronym>
        ,
        usted fácilmente puede extender la clase base a fin de proveer
        generación de código para
        otras tareas como: JavaScript, archivos de
        configuración, apache vhost, etc.
    </para>

    <sect2 id="zend.codegenerator.introduction.theory">
        <title>Teoría de Operación</title>

        <para>
            En el caso de uso más típico, simplemente instanciará una clase de
            generación de código y
            podrá pasarle tanto la configuración adecuada
            o configurarla después de la instanciación.
            Para generar el código,
            simplemente haga "echo" del objeto o llame a su método
            <methodname>generate()</methodname>
            .
        </para>

        <programlisting language="php"><![CDATA[
// Pasando la configuración al constructor:
$file = new Zend_CodeGenerator_Php_File(array(
    'classes' => array(
        new Zend_CodeGenerator_Php_Class(array(
            'name'    => 'World',
            'methods' => array(
                new Zend_CodeGenerator_Php_Method(array(
                    'name' => 'hello',
                    'body' => 'echo \'Hello world!\';',
                )),
            ),
        )),
    )
));

// Configurando después de la instanciación
$method = new Zend_CodeGenerator_Php_Method();
$method->setName('hello')
       ->setBody('echo \'Hello world!\';');

$class = new Zend_CodeGenerator_Php_Class();
$class->setName('World')
      ->setMethod($method);

$file = new Zend_CodeGenerator_Php_File();
$file->setClass($class);

// Mostrar el archivo generado
echo $file;

// o grabarlo a un archivo:
file_put_contents('World.php', $file->generate());
]]></programlisting>

        <para>
            Ambos ejemplos anteriores mostrarán el mismo resultado:
       </para>

        <programlisting language="php"><![CDATA[
<?php

class World
{

    public function hello()
    {
        echo 'Hello world!';
    }

}
]]></programlisting>

        <para>
            Otro caso de uso común es actualizar el código actual -- por ejemplo,
            para añadir un
            método a una clase. En ese caso, primero debe
            inspeccionar el código actual utilizando
            reflexión, y entonces
            añadir su nuevo método.
            <classname>Zend_CodeGenerator</classname>
            lo hace trivialmente simple,
            aprovechando
            <link linkend="zend.reflection">Zend_Reflection</link>
            .
        </para>

        <para>
            Como ejemplo, digamos que hemos grabado lo anterior al archivo
            "
            <filename>World.php</filename>
            ", y que ya está incluído. Podríamos entonces hacer lo
            siguiente:
        </para>

        <programlisting language="php"><![CDATA[
$class = Zend_CodeGenerator_Php_Class::fromReflection(
    new Zend_Reflection_Class('World')
);

$method = new Zend_CodeGenerator_Php_Method();
$method->setName('mrMcFeeley')
       ->setBody('echo \'Hello, Mr. McFeeley!\';');
$class->setMethod($method);

$file = new Zend_CodeGenerator_Php_File();
$file->setClass($class);

// Mostrar el archivo generado
echo $file;

// O mejor aún, volver a grabarlo al archivo original:
file_put_contents('World.php', $file->generate());
]]></programlisting>

        <para>
            El archivo de la clase resultante se vería así:
       </para>

        <programlisting language="php"><![CDATA[
<?php

class World
{

    public function hello()
    {
        echo 'Hello world!';
    }

    public function mrMcFeeley()
    {
        echo 'Hellow Mr. McFeeley!';
    }

}
]]></programlisting>
    </sect2>
</sect1>
