= An example for wrapping of classes = {{{ module test; import lua.all; version (Tango) { import tango.io.Stdout; import tango.text.convert.Integer : parseInt = toString; } else { import std.stdio; import std.string : parseInt = toString; } class Integer { private int data_; public this (LuaState L) { data_ = L.checkInteger(1); } public this () { this.data_ = 1; } public int data () { return this.data_; } public int lua_get_data (LuaState L) { L.pushNumber (this.data_); return 1; } public int data (int value) { return this.data_ = value; } public int lua_set_data (LuaState L) { this.data_ = L.checkInteger (1); return 0; } public int lua_tostring (LuaState L) { L.pushString (parseInt(data_)); return 1; } public static int lua_static (LuaState L) { L.pushString ("Hello world!"); return 1; } } class Base { private Integer data_; this () { this.data_ = new Integer; } public Integer data () { return this.data_; } public int lua_get_data (LuaState L) { L.wrapClass (data_); return 1; } public int lua_set_data (LuaState L) { data_ = L.unwrapClass !(Integer) (1); return 0; } } class Derived : Base { public int lua_get_one (LuaState L) { L.pushNumber (1); return 1; } } int simpleFunction (LuaState L) { writefln("lua_set_data called with: %s", new LuaStackTrace (L)); return 0; } version(D_Version2) mixin("alias const(char) cchar;"); else alias char cchar; int main (string[] args) { char[] stdout; void writer (cchar[] data) { stdout ~= data; } auto L = new LuaState (&writer); // register the function mixin (mixinLuaRegisterFunction ("L", "simpleFunction", "mylib.func")); // full typeid string isn't required for functions mixin (mixinLuaRegisterFunction ("L", "test.Integer.lua_static", "mylib.static")); // register the constructor mixin (mixinLuaRegisterConstructor ("L", "test.Integer", "mylib.newint")); // register the methods in this state mixin (mixinLuaRegisterMethod ("L", "test.Integer.lua_get_data", "get")); // full typeid string is required for class stuff mixin (mixinLuaRegisterMethod ("L", "test.Integer.lua_set_data", "set")); mixin (mixinLuaRegisterMethod ("L", "test.Integer.lua_tostring", "__tostring")); mixin (mixinLuaRegisterMethod ("L", "test.Base.lua_get_data", "get")); mixin (mixinLuaRegisterMethod ("L", "test.Base.lua_set_data", "set")); mixin (mixinLuaRegisterMethod ("L", "test.Derived.lua_get_data", "get")); mixin (mixinLuaRegisterMethod ("L", "test.Derived.lua_set_data", "set")); mixin (mixinLuaRegisterMethod ("L", "test.Derived.lua_get_one", "one")); L.pushNil (); L.pushNumber (2.0); L.pushInteger (3); writefln ("%s %s %s", L.getObject (-1).toString, L.getObject (-2).toString, L.getObject (-3).toString); auto b = new Base (); auto d = new Derived (); // push a wrapper for b L.wrapClass (b); // make it a global var L.setGlobal ("base"); // also possible for properties, returning classes L.wrapClass (b.data).setGlobal ("i"); L.wrapClass (d).setGlobal ("d"); string code = ` print (mylib.static ()); direct = base:get (); indirect = i; idirect = base:get():get(); iindirect = i:get(); print (i:get()); i:set(10); base:set(i); print (base:get():get()); print (direct:get(), indirect:get(), idirect, iindirect); mylib.func ('abc', 1, 2, 3); bar = mylib.newint (100); print (bar:get()); print (d:one()); d:set( mylib.newint (13) ); print (d:get ());`; L.doString (true, code, "Foo"); writef("Output:\n----------\n" ~ stdout ~ "\n-----------\n"); return 0; } }}} Authors: [http://xammy.homelinux.net/wiki/Homepage_von_Matthias_Walter Matthias Walter] | [http://www.gameformats.de.vu Trass3r]