To write modular code, a system may expose its interface in the form of virtual functions, events or filters.
virtual functions: allows a derived class to hook the input and output of a single function in the base class.
events: feeds input to external functions when certain things happened. Events only hooks the input without providing an output.
filters: allows external functions to form input-output chains to modify data at any point of execution.
Use whatever patterns to allow external modifications to the input-output of your modular code.
Filters is a design pattern of input-output chains. Please see script/ide/System/Core/Filters.lua for detailed usage.
You can simply apply a named filters at any point of execution in your code to allow other users to modify your data.
For example, one can turn
data = data; into an equivalent filter, like below
data = GameLogic.GetFilters():apply_filters("my_data", data, some_parameters);
The above code does nothing until some other modules
Each filter function takes the output of the previous filter function as its first parameter, all other input parameters are shared by all filter functions, like below
F1(input, ...)-->F2(F1_output, ...)-->F3(F2_output, ...)-->F3_output
Filters is the recommended way for plugin/app developers to extend or modify paracraft.