ClassBuild Class

ClassBuild class can be used to create a class and its methods.

Description
The class contains the following methods: void new(str _name, boolean _allowExisting = true                                                                  // this is the constructor of the class) void addMemberVariable(str _variableType, str _variableName)                                                 // this method is used to create a variable declaration in a class) TreeNode addMethod(str _name, str _source)                                                                          // this method is used to create new methods and set their source code) void addSourceToMethod(str _memberFunction, str _addSource)                                             // using this method we can set the source code of an existing method) ClassNode classNode                                                                                                         // this method returns a ClassNode object pointing to the created class) public MemberFunction getMethodImplementation(str _methodName, boolean _includeParents) // the method return a MemberFunction object, which has methods to edit or view the source code of the specified method of the class) public str name                                                                                                                   // the method returns the name of the created class) TreeNode overrideMethod(str _name, str _newSource = '')                                                        // this method is used to override the method of the parent class in case one exists)

Example with ClassBuild
static void Job17(Args _args) {   ClassBuild  classBuild; DictClass  dictClass; ;   classBuild = new ClassBuild("TRN_ClassBuild", false); classBuild.addMethod("test", @"void test {   ;    print 'Hello';    pause; }");

classBuild.addMemberVariable("\n   TreeNodeName", "testVar;"); classBuild.addMethod("test2", 'void test2\n{\n}'); classBuild.addSourceToMethod("test2", @"   ;    testVar = 'TRN_ClassBuild';    info('We created a Class ' + testVar + ' and can use its variables');    TreeNode::findNode('Classes\\'+TestVar).AotNewWindow;");

classBuild.classNode.AOTcompile;

box::info(strFmt("Creating class %1 with 2 methods. Code of method test2:\n\n%2", classBuild.name, classBuild.getMethodImplementation("test2", false).AOTgetSource));

dictClass = new DictClass(className2Id(classBuild.name)); dictClass.callObject('test2', dictClass.makeObject); }

Explanation
In line 6 we create a new Object of class ClassBuild. Into the constructor we pass the name of the class we want to create and an optional paramter, which controls the execution of code in case the class already exists in the AOT. After the execution of this line the class already exists. After that we add a method test to our class and set the source code for this method. Then we add a member variable of our class, and will try using this variable in a second method we create - test2. You can see that here I did this in 2 steps on purpose - to show the way you can use the method addSourceToMethod. OK, now all the methods are created and we have to compile our class. For this we can use the method AotCompile of class TreeNode, which we access through the method classNode of the created class. Now, to see how 2 other methods work, we show a message dialog with the name of the class being created and the source code of one of the methods.

Then, just to show you the class works and is ready to be used, we can call one of its methods for execution. For this, we use the class DictClass and its methods, but I will not discuss it in this post.

Another way of creating a class
There is also another way of creating the same class - by using the UtilElements table: (code provided by AndyD from AxForum) UtilIdElements utilIdElements; TreeNode tn; ;   utilIdElements.initValue; utilIdElements.Name = "newClass"; utilIdElements.recordType = UtilElementType::Class; utilIdElements.insert;

tn = xUtilIdElements::getNode(utilIdElements); tn.AOTcompile(1); tn.AOTsave;

Download and try it
Job17.xpo