From 001933de42c6318beefc9c9474d4f94d32d43d35 Mon Sep 17 00:00:00 2001 From: Izuchukwu Elechi Date: Wed, 25 Oct 2017 17:52:07 -0400 Subject: [PATCH 1/2] Adds class method support --- package.json | 2 +- src/index.js | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index bd85685..8a846c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cocoascript-class", - "version": "0.1.2", + "version": "0.2.0", "description": "Lets you create real ObjC classes in cocoascript so you can implement delegates, subclass builtin types, etc", "main": "lib/index.js", "repository": "https://github.com/darknoon/cocoascript-class", diff --git a/src/index.js b/src/index.js index c2ed229..3c5bb70 100644 --- a/src/index.js +++ b/src/index.js @@ -11,7 +11,8 @@ const SuperInit = SuperCall(NSStringFromSelector("init"), [], {type:"@"}); export default function ObjCClass(defn) { const superclass = defn.superclass || NSObject; const className = (defn.className || defn.classname || "ObjCClass") + NSUUID.UUID().UUIDString() - const reserved = new Set(['className', 'classname','superclass']); + const classMethods = (defn.classMethods || defn.classmethods || {}) + const reserved = new Set(['className', 'classname','superclass', 'classMethods', 'classmethods']); var cls = MOClassDescription.allocateDescriptionForClassWithName_superclass_(className, superclass) // Add each handler to the class description const ivars = []; @@ -25,6 +26,14 @@ export default function ObjCClass(defn) { cls.addInstanceVariableWithName_typeEncoding(key, "@"); } } + // Add each class method to the class description + for(var key in classMethods) { + const v = classMethods[key] + if (typeof v == 'function') { + var selector = NSSelectorFromString(key) + cls.addClassMethodWithSelector_function_(selector, v); + } + } cls.addInstanceMethodWithSelector_function_(NSSelectorFromString('init'), function() { const self = SuperInit.call(this); @@ -48,4 +57,3 @@ function getIvar(obj, name) { object_getInstanceVariable(obj, name, retPtr); return retPtr.value().retain().autorelease(); } - From 5c4be4c0bef39e1527cc691112b2313b5dd1e8c3 Mon Sep 17 00:00:00 2001 From: Izuchukwu Elechi Date: Fri, 27 Oct 2017 18:04:13 -0400 Subject: [PATCH 2/2] Updates readme with superclass and class methods --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index 6ee9889..3b3c4b3 100644 --- a/README.md +++ b/README.md @@ -81,4 +81,40 @@ const obj = HasDescriptionClass.new(); log(obj); // calls description to become a string ```` +### Setting your superclass +The `superclass` property lets you set your superclass, equivalent to `@interface myClass : superclass`. Here, we subclass `NSView` and create a square view: + +````js +import ObjCClass from 'cocoascript-class' + +const ViewClass = new ObjCClass({ + superclass: NSView +}); + +const view = ViewClass.new(); +// call inherited methods +view.setFrame(NSMakeRect(0, 0, 100, 100)); +```` + +If not set, the superclass is `NSObject`. + +### Adding class methods + +The `classMethods` property lets you add class methods similar to how instance methods are added. Here is an example: + +````js +import ObjCClass from 'cocoascript-class' + +const HasClassMethodsClass = new ObjCClass({ + classMethods: { + test() { + log("test"); + } + } +}); + +// call methods on the class +[HasClassMethodsClass test]; +HasClassMethodsClass.test(); +````