I worked on my object oriented extensions for CMake and am on a much higher level of usability than before!

try it at https://github.com/toeb/oo-cmake

and as always: Feedback is most welcome

See the following object tutorial for ease of use: (for the current version look at the readme.md on github)

### using objects ### ============= # oo-cmake is very similar to javascript # I actually used the javascript reference to figure out how things could be done :) # oo-cmake is a pure object oriented language like javascript (only objects no types per se) # oo-cmake is currently file based and relies heavily on dynamic functions to be upfron about it: # oo-cmake is very slow (depending on what your doing) ## creating a object ## ================= obj_new(myobject) # ${myobject} now is a reference to an object obj_exists(${myobject} _exists) assert(_exists) ## deleting a object ## ================= # oo-cmake does not contains automatic memory management # you can however remove all objects by calling obj_cleanup # (a very crude way of garbage collection) I would suggest calling it at the end of cmake. obj_new(object_to_delete) obj_delete(${object_to_delete}) # object_to_delete still contains the same reference # but the object does not exists anymore and the following returns false obj_exists(${object_to_delete} _exists) assert(NOT _exists) ## setting and setting property ## ================== obj_new(myobject) # call obj_set passing the object reference # the propertyname 'key1' and the value 'val1' # everything beyond 'key1' is saved (as a list) obj_set(${myobject} key1 "val1") #call obj_get passing the object refernce the result variable and # the key which is to be gotten obj_get(${myobject} theValue key1) assert(theValue) assert(${theValue} STREQUAL "val1") ## setting a function and calling it ## ================================= obj_new(obj) obj_set(${obj} last_name "Becker") obj_set(${obj} first_name "Tobias") #obj_setfunction accepts any function (cmake command, string function, file function, unique function (see function tutorial)) # if you use a cmake function be sure that it will not be overwritten # the safest way to add a function is to use obj_declarefunction # you can either specify the key where it is to be stored or not # if you do not specify it the name of the function is used function(greet result) # in the function you have read access to all fields of the proeprty # as will as to 'this' which contains the reference to the object # this sets the variable ${result} in PARENT_SCOPE (returning values in cmake) set(${result} "Hello ${first_name} ${last_name}!" PARENT_SCOPE) endfunction() obj_setfunction(${obj} greet) obj_callmember(${obj} greet res) assert(res) assert(${res} STREQUAL "Hello Tobias Becker!") # alternatively you can also use obj_declarefunction # this is actually the easiest way to define a function in code obj_declarefunction(${obj} say_goodbye) function(${say_goodbye} result) set(${result} "Goodbye ${first_name} ${last_name}!" PARENT_SCOPE) endfunction() obj_callmember(${obj} say_goodbye res) assert(res) assert(res STREQUAL "Goodbye Tobias Becker!") ## built in methods ## ================ # obj_new creates a object which automatically inherits Object # Object contains some functions e.g. to_string, print, ... # obj_new(obj) obj_callmember(${obj} print) # this prints all members # ie #{ # print: [function], # to_string: [function], # __ctor__: [object :object_Y3dVWkChKi], # __proto__: [object :object_AztQwnKoE7], #} ## constructors ## ============ # you can easily define a object type via constructor function(MyObject) # declare a function on the prototype (which is accessible for all objects) # inheriting from MyObject obj_declarefunction(${__proto__} myMethod) function(${myMethod} result) set(${result} "myMethod: ${myValue}" PARENT_SCOPE) this_set(myNewProperty "this is a text ${myValue}") endfunction() # set a field for the object this_set(myValue "hello") endfunction() obj_new(obj MyObject) # type of object will now be MyObject obj_gettype(${obj} type) assert(type) assert(${type} STREQUAL MyObject) # call obj_callmember(${obj} myMethod res) assert(res) assert(${res} STREQUAL "myMethod: hello") obj_set(${obj} myValue "othervalue") obj_callmember(${obj} myMethod res) assert(res) assert(${res} STREQUAL "myMethod: othervalue") obj_get(${obj} res myNewProperty) assert(res) assert(${res} STREQUAL "this is a text othervalue") ## functors ## ======== ## binding a function ## ================== # you can bind any function to an object without # setting it as property # causing the function to get access to 'this' # and all defined properties function(anyfunction) this_callmember(print) endfunction() obj_new(obj) obj_bindcall(${obj} anyfunction) ## print the object # alternatively you can bind the function to the object obj_bind(boundfu ${obj} anyfunction) call_function(${boundfu}) # prints the object # alternatively you can bind and import then function # beware that you might overwrite a defined function if you append REDEFINE # obj_bindimport(${obj} anyfunction myBoundFunc REDEFINE) myBoundFunc() # print the object