/* This program illustrates several difference between static objects and
 * dynamic objects.  The syntax by which they are created differs;
 * dynamic objects  use the 'new' operator.
 *
 * Static objects have their create() public and operator {} called before
 * main() executes; dynamic objects have their create() public and
 * {} operator called at the point the 'new' operator is executed.
 *
 * Oh, and static objects can be used as variable initializers.
 *
 * This program prints out the following lines:
 *
 *      Creating 1
 *      Completing 1
 *      Beginning main()
 *      Object 1, info is 100
 *      Creating 2
 *      Completing 2
 *      Object 2, info is 200
 *
 * See if you can figure out why.
 */

/* Here's the class around which this sample revolves */
class myClass {
    /* CLASS PRIVATE VARIABLES */
    var
        objNum;         /* Initialized by the create public */

    /* CLASS METHOD VARIABLES */
    public var
        info = 0;       /* Information about this object */

    /* CLASS METHOD PROCEDURES */
    public proc
        create(num)
        {
            objNum = num;
            say( "Creating ", objNum, "\n" );
        }
    operator {} ()
        {
            say( "Completing ", objNum, "\n" );
        }
    public proc
        describe()
        {
            say( "Object ", objNum, ", info is ", info, "\n" );
        }
}

proc main()
{
    /* Print out a message when main executes */
    say( "Beginning main()\n" );

    /* Declare, define, and describe a static object */
    var
        myObj = myClass(1) {
            info = 100
        };
    myObj.describe();

    /* Declare, define, and describe a dynamic object */
    var
        myOtherObj;

    myOtherObj = new myClass(2) {
        info = 200
    };
    myOtherObj.describe();
}