Printable

For an actual type parameter Person this factory generates a class PrintablePerson that extends class Person. PrintablePerson has a public print() method that prints out for an object all the values of its public member variables.

Factory/Java Source

The source can be found in the Factory/Java .zip-archive in factory/classes/examples/Printable.factory:

<param> <var> T </var> </param>

package test;

public class
<apply>
    <const> "Printable" </const>
    <method> concat </method>
    <args>
        <apply>
            <class> factory.Toolbox </class>
            <method> getRelativeName </method>
            <args>
                <var> T </var>
            </args>
        </apply>
    </args>
</apply>
extends <var> T </var>
{                    
    public void print() {
        // iterate over attributes of T
        <for> <var> I </var>
        <apply>
            <var> T </var>
            <method> getFields </method>
        </apply>
        <body>
            System.out.println(
                <literal>
                    <apply>
                        <var> I </var> <method> getName </method>
                    </apply>
                </literal>
                +": "+
                this.
                <apply>
                    <var> I </var> <method> getName </method>
                </apply>
            );
        </body>
        </for>
    }
}

Test Program

The following unparameterized factory can be found in factory/src/test/PrintableTest.factory in the Factory/Java .zip-archive. It applies factory Printable to class Person, instantiates an object of the resulting class PrintablePerson, sets some of its attributes to arbitrary values and uses its print() method.

package test;

class PrintableTest {
    public static void main(String argv[]) {
        <let> <var> T </var>
        <apply>
            <factory> examples/Printable </factory>
            <args> <const> test.Person </const> </args>
        </apply>
        <body>
            <var> T </var> p = new <var> T </var>();
       
            p.name = "Mr. Z";
            p.plz = 4711;
           
            p.print();
        </body> </let>
    }
}

This factory can be compiled in the factory directory with
java -classpath classes factory.Factory -javad src -classd classes src/test/PrintableTest
and run with
java -classpath classes test.PrintableTest