From e942ba486e3c633fb3b7c9b1fa8a93f895d04883 Mon Sep 17 00:00:00 2001 From: tobspr Date: Sun, 16 Jan 2022 20:30:51 +0100 Subject: [PATCH] Add helper methods to extend classes --- mod_examples/class_extensions.js | 32 ++++++++++++++++++++++++++++++++ src/js/mods/mod_interface.js | 15 +++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 mod_examples/class_extensions.js diff --git a/mod_examples/class_extensions.js b/mod_examples/class_extensions.js new file mode 100644 index 00000000..55431c32 --- /dev/null +++ b/mod_examples/class_extensions.js @@ -0,0 +1,32 @@ +/** + * Shows how to extend builtin classes + */ + +const METADATA = { + website: "https://tobspr.io", + author: "tobspr", + name: "Mod Example: Class Extensions", + version: "1", + id: "class-extensions", + description: "Shows how to extend builtin classes", +}; + +class Mod extends shapez.Mod { + init() { + this.modInterface.extendClass(shapez.MetaBeltBuilding, { + // this replaces a regular method + getShowWiresLayerPreview() { + return true; + }, + + // Instead of super, use this.$super() + getIsReplaceable() { + return this.$super.getIsReplaceable.call(this); + }, + + getIsRemoveable() { + return false; + }, + }); + } +} diff --git a/src/js/mods/mod_interface.js b/src/js/mods/mod_interface.js index e1043cb1..c83f8b11 100644 --- a/src/js/mods/mod_interface.js +++ b/src/js/mods/mod_interface.js @@ -388,4 +388,19 @@ export class ModInterface { return returnValue; }; } + + extendClass(classHandle, extensionClass) { + const extendPrototype = function (base, extension) { + const properties = Array.from(Object.getOwnPropertyNames(extension)); + base.$super = base.$super || {}; + properties.forEach(propertyName => { + if (["constructor", "name", "length", "prototype"].includes(propertyName)) { + return; + } + base.$super[propertyName] = base.$super[propertyName] || base[propertyName]; + base[propertyName] = extension[propertyName]; + }); + }; + extendPrototype(classHandle.prototype, extensionClass); + } }