Magick will have the ability to script extra functionality (ie. write custom code without touching
the core Magick code). Magick will then be able to, at various points in Magick's execution make
certain callbacks, which will execute the functions created by the user. When those functions are
finished their processing, they will return control to Magick, and processing will continue. The
scripting language itself will be interfaced with Mantra, and mantra will expose a callback API to
Magick, so that it can invoke the relevant execution.
Many users request features that are either considered by the Development Team to be beyond the
scope of what Magick (the core product) should do (for example, sending emails), or that are
not in line with the direction the Development team wishes to head with Magick. The solution to
this is to create an easy way for users to write the functionality themselves, and get Magick to
hand over to their own code, and take control again once its done.
Another issue we have noticed is sometimes users want things like the default committee which can
run a certain command changed, or the behavior of a certain command to be different, or require
more information, etc. Once again, letting users re-bind commands, and write their own commands
helps with this process, giving Magick much more flexability and appeal to users.
Mantra must be created.
The scripting language we have decided to use is Python.
Python was chosen because it is also natively object oriented, internally multi-threaded, and
fairly easy to embed into a C++ program. It is also becoming more and more popular, meaning
that there is an existing body of people who understand how to use it, and it coming installed
on more and more systems.
The scripting language will first have to be implemented into Mantra first. The interface to
the scripting language should only expose an API consisting of:
Starting and stopping the interpereter.
Loading (or re-loading) a script file.
Unloading a file and its functions (if possible).
Exposing a function (including return codes and parameters), variables, and functions
from the API user to the scripting language for use in scripts.
Exposing an object (and functions, and data items) to the scripting language from the
Checking whether a subroutine exists in the script.
Running a specific subroutine from one of the files that has been loaded with optional
arguments. This should return an integer return value from the subroutine. An exception
should be raised if the function fails to execute for any reason.
Once the scripting language is implemented into Mantra, it should be reasonably easy to implement
the necessary callbacks into Magick. The parameters that should be passed to each callback will
be determined as the callback is implemented, and when this happens, a skeleton callback function
should be implemented in the scripting language.
The current design allows for us to change the scripting language at any time if either another
suitable candidate is found, or if someone wishes to implement the same scripting API for another
language. Therefore, it is possible that Magick may support other scripting languages in the
future, however this is not planned.
If python is not installed on a system, the scripting language will have to be disabled, as we
do not want to distribute python with Magick, and while the user COULD compile python in their
own home directory, its impractical for them to do so.
Magick will be blindly handing off execution control to the python interpereter. There is no
way to account for how long the python interpereter will keep control, or what the script the
user has written (or is using) will do. This could be very dangerous, however the scripting
language will be a 'use at your own risk' deal.
Several sample scripts for EVERY callback that is used by Magick will have to be created.
This includes scripts ranging from simple ones to change the bindings of a commands to be
accessable by a different committee, right up to creating an entirely new service complete
with its own functions and data storage.
Python.
|