{"_id":"@aimingoo/metameta","_rev":"1-91b08333a5f94f58aa230d777797907d","name":"@aimingoo/metameta","dist-tags":{"latest":"0.9.1"},"versions":{"0.9.1":{"name":"@aimingoo/metameta","version":"0.9.1","description":"Meta core and meta-class programming framework.","main":"index.js","author":{"name":"aimingoo","email":"aiming@gmail.com"},"repository":{"type":"git","url":"git://github.com/aimingoo/metameta.git"},"scripts":{"test":"mocha test","coverage":"istanbul cover _mocha --root=./ --dir=coverage --report=none --print detail"},"dependencies":{},"devDependencies":{"chai":"^4.1.2","mocha":"^5.2.0","mocha-logger":"^1.0.3"},"license":"Apache-2.0","gitHead":"e8c8eeabe1c59a009fe8b55addc1b3e4f13184f3","bugs":{"url":"https://github.com/aimingoo/metameta/issues"},"homepage":"https://github.com/aimingoo/metameta#readme","_id":"@aimingoo/metameta@0.9.1","_npmVersion":"6.4.0","_nodeVersion":"10.1.0","_npmUser":{"name":"aimingoo","email":"aiming@gmail.com"},"dist":{"integrity":"sha512-Xi+w+LUeJZYnhL4xSPHIDpeSql/j3QUlfY4LmZiJUSW2eQmDzeXEtAKjzawZbIr8lWGVNjQJqsxKbArNo24B8w==","shasum":"880512ae1caa8b6136d608a75ea0dd36ef35f64f","tarball":"https://registry.npmjs.org/@aimingoo/metameta/-/metameta-0.9.1.tgz","fileCount":6,"unpackedSize":25050,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdoM/CRA9TVsSAnZWagAAprEP/iHI2Gmw8RQBI0Ixz4Y8\nvWxxo4tX6MoAbf0PW0xG0qXoNBOBTsEmoX7BVBY+RqtdavGR+twI26aMdQ6F\nzdN4vc9vrtZPme7GyEh+mg+dn25Qpc5PsDu0gIht0OVzGKnKIcNCnc4U3snu\nrpHWXo78gtoKuD2poluakop6IhHYaDO6Sssk0mBvht1F8oj0aXdwDLDJyHDn\noYpZ5+dQkefeoXGQ/lTGJtFKTNEZXdgssv+qg9G8s5txtUh9xF5DDLVKpXjN\ndOZYaVGahj+9PmPFMphk//631PHGNkKBxlJ2sqchSWncMz6qttZBZF8xxPd7\nfabl0s+zSKSbGrFLn74jQYcIu042Fz2rpn2S83eoUaaGSlbR3eD2hN+Lc6fi\nnT0joTxGE9X43XJpSM648WxP63wcbjalSOLfXzoiJVecybiD4HPbQGGVy9U6\nZ5AAFwo+NQOnxOc6AEKlhKMqolhtj3a9i2ff4HRIHFrBRU1EwZHV6+pjtJMa\nIWYzGYpoZ4db59q9QC1m0W6DTQP3v96g0gUhUQeo0nxPijtFkMU65R+s5R8J\n6H47mMMtf2D0jl7ka6gkZ6vHr6os/oVJhN5yrye+uzGenqjAa/npN0qgK85E\nCzFEqbmTUJjo2tnYO8wm5WcbJBJHpr8Bn1AYKM+dFRSh0TWwBncYrX7Sm2Hs\nAPb0\r\n=huHF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYiDsDFpTVyX98gVYK+rY25AkHGO/FmhpVWXzKBiYzTAIgIvdsZw1YBfT1n5gbLdd7L7uu9n/yX+INObY5+uLvbUE="}]},"maintainers":[{"name":"aimingoo","email":"aiming@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metameta_0.9.1_1534493502600_0.6591840702148255"},"_hasShrinkwrap":false}},"time":{"created":"2018-08-17T08:11:42.344Z","0.9.1":"2018-08-17T08:11:42.653Z","modified":"2022-04-04T12:19:23.631Z"},"maintainers":[{"name":"aimingoo","email":"aiming@gmail.com"}],"description":"Meta core and meta-class programming framework.","homepage":"https://github.com/aimingoo/metameta#readme","repository":{"type":"git","url":"git://github.com/aimingoo/metameta.git"},"author":{"name":"aimingoo","email":"aiming@gmail.com"},"bugs":{"url":"https://github.com/aimingoo/metameta/issues"},"license":"Apache-2.0","readme":"# Metameta\n\nMetameta is meta core and meta-class programming framework.\n\n\n- [Usage](#usage)\n- [The Meta](#the-meta)\n  * [atom](#atom)\n  * [meta/Atom](#metaatom)\n  * [Meta](#meta)\n  * [MetaClass](#metaclass)\n  * [MetaObject](#metaobject)\n- [Shadow meta](#shadow-meta)\n- [More testcases](#more-testcases)\n- [Interface](#interface)\n- [History](#history)\n\n\n\n## Usage\n\n```bash\n# install from npm\n> npm install @aimingoo/metameta\n\n# OR, install from github\n> npm install aimingoo/metameta\n```\n\nAnd use in javascript\n\n```javascript\n// Meta core\nvar {Meta, MetaClass, MetaObject} = require('metameta');\n\n// Helper methods, all home object safed.\nvar {isMeta, isAtom, asAtom} = Meta;\n\n// learn case\nvar Objext = Meta.from(Object);\nconsole.log(Objext.keys(new Objext)); // []\nconsole.log(Meta.isAtom(new Objext)); // true\n```\n\n\n\n## The Meta\n\n### atom\n\nThe **atom** is smallest unit of pure object in javascript, it's object but not inherited from Object(). An atom is a object. `null`, `Object.prototype`, `arguments` and `namespace` are atom objects in javascript language.\n\n```bash\n> Meta.isAtom(null);\ntrue\n\n> Meta.isAtom(Object.prototype)\ntrue\n```\n\n\n\n### meta/Atom\n\natom created by meta, so the **meta** is constructor of atoms, with **Atom()** on the concept is the same. meta is base unit of Meta system, and is function always.\n\n```bash\n# meta is same of Atom()\n> meta = new Meta; \n\n# atom created\n> atom = new meta;\n\n# check is atom\n> Meta.isAtom(atom);\ntrue\n\n# check is object\n> typeof atom;\n'object'\n```\n\n\n\n### Meta\n\nMeta is meta's class.\n\n```javascript\n// extend\nclass MetaX extends Meta {};\nvar meta = new MetaX;\n\n// meta is atom too.\nconsole.log(Meta.isAtom(new Meta)); // true\nconsole.log(Meta.isAtom(meta)); // true\n\n// instance from meta, check inheritance\nvar x = new meta;\nconsole.log(x instanceof meta); // true\nconsole.log(x instanceof Meta); // true\nconsole.log(x instanceof MetaX); // true\n// another\nclass MetaX2 extends Meta {};\nconsole.log(x instanceof MetaX2); // false\n```\n\n\n\n### MetaClass\n\nMetaClass is root of Meta-classes programming system.\n\n```javascript\n// meta-classes\nclass MetaClassEx extends MetaClass {\n    // ...\n}\n\n// extend meta system\n//  NOTE: must extends from a meta/Atom\nclass AtomObjects extends new MetaClassEx() {\n    // ...\n}\n\n// check\nconsole.log(MetaClass.isClassOf(MetaClassEx)); // true\nconsole.log(MetaClassEx.isClassOf(AtomObjects)); // true\nconsole.log(MetaClassEx.isClassOf(new AtomObjects)); // true\n// another\nconsole.log(MetaClassEx.isClassOf(new MetaObject)); // false\n```\n\n\n\n### MetaObject\n\nMetaObject is a meta of MetaClass, and is a Class/Atom-constructor of atoms.\n\n```javascript\n// MetaObject is defined in metameta\nvar obj = new MetaObject;\nconsole.log(Meta.isAtom(obj)); // true\n\n// extend object system\nclass MetaObjectEx extends MetaObject{}\n\n// create atom\nvar x = new MetaObjectEx;\n\n// check\nconsole.log(MetaClass.isClassOf(MetaObject)); // true\nconsole.log(MetaClass.isClassOf(MetaObjectEx)); // true\nconsole.log(MetaClass.isClassOf(x)); // true\n\n// check in pure javascript\nconsole.log(x instanceof MetaObject); // true\nconsole.log(x instanceof MetaObjectEx); // true\nconsole.log(x instanceof MetaObject); // true\nconsole.log(x instanceof MetaClass); // true\nconsole.log(x instanceof Meta); // true\n\n// more\nvar isPrototypeOf = (...args) => Object.prototype.isPrototypeOf.call(...args);\nconsole.log(isPrototypeOf(MetaObject, MetaObjectEx)); // true\nconsole.log(isPrototypeOf(MetaClass, MetaObject)); // false\nconsole.log(isPrototypeOf(MetaClass, MetaObjectEx)); // false\n```\n\n\n\n## Shadow meta\n\nA shadow is meta from native constructor.\n\n```javascript\n// shadow from native-constructor\nvar Objext = Meta.from(Object);\n\n// shadow is meta\nvar x = new Objext;\nconsole.log(Meta.isAtom(x)); // true\n\n// shadow has static methods from source\nconsole.log(Objext.keys(x)); // []\n```\n\n\n\n## More testcases\n\n```bash\n# pull source\n> git clone https://github.com/aimingoo/metameta\n> cd metameta\n> npm install\n\n# test\n> npm test\n\n# coverage\n> npm -g install istanbul\n> npm run coverage\n```\n\n\n\n## Interface\n\n* Meta's Class methods\n\n    ```javascript\n    // Return a object is atom object\n    // @param {object|function} - a object\n    Meta.isAtom(x)\n\n    // Return a new atom/Atom, it's proxy of x, and prototype by base.\n    // @param {object}[object] - a atom base another atom object\n    // @param {function}[function=Atom] - a meta base meta/Meta/Atom...\n    Meta.asAtom(x, base)\n\n    // Return a class is Meta\n    // @param {function} - a class\n    Meta.isMeta(cls)\n\n    // Return a shadow meta for native-constructor\n    // @param {function} - a native constructor\n    Meta.from(constructor)\n    ```\n\n* MetaClass's Class methods\n\n    ```javascript\n    // Return the class is base of x\n    // @param {object} - is instance of class\n    // @param {function} - is sub-class of class\n    MetaClass.isClassOf(x)\n    ```\n\n* extends from Meta\n\n    ```javascript\n    class MetaX extends Meta {}\n    ```\n\n* meta's extends\n\n    ```javascript\n    // Meta-classes programming framework based\n    class X extends new MetaClass {}\n\n    // OR\n    class X extends new MetaX{}\n    ```\n\n\n\n## History\n\n```\n2018.08.17 - v0.9.1 released, happy Chinese traditional valentine's day.\n```\n\n","readmeFilename":"README.md"}