Ok, this is going to be ugly as I haven't posted the TLUA component yet, but I think you can figure it out w/o it as basically all you have to do is replace its reference with a Plua_State

This code is my reference code for my Delphi->Lua application that is comming around:
[pascal]unit TestLuaClass;

interface

uses
Classes, LuaWrapper, Lua, LuaUtils, Lauxlib, LuaLib;

type
TTestClass=class(TPersistent)
private
FBalance: Double;
procedure SetBalance(const Value: Double);
public
class procedure RegisterTo(LuaScript:TLUA);
published
procedure Deposit(Amountouble);
procedure Withdraw(Amountouble);
property Balance : Double read FBalance write SetBalance;
end;

implementation

uses
SysUtils,
TypInfo;

const
LuaClassName = 'TestClass';

function Check(L: Plua_State; Idx : Integer) : TTestClass;
begin
result := nil;
if lua_type(L, Idx) = LUA_TTABLE then
result := LuaGetTableLightUserData(L, Idx, '_Self')
else
luaL_typerror(L, Idx, LuaClassName);
end;

function new_TestClass(L: Plua_State): Integer; cdecl;
var
c : TTestClass;
begin
if lua_type(L, 1) <> LUA_TTABLE then
lua_remove(L, 1);
c := TTestClass.Create;
LuaSetTableLightUserData(L, 1, '_Self', c);
luaL_getmetatable(L, LuaClassName);
lua_setmetatable(L, -2);
result := 1;
end;

function gc_TestClass(L: Plua_State): Integer; cdecl;
var
c : TTestClass;
begin
c := Check(L, 1);
c.Free;
result := 0;
end;

function indexTestClass(L: Plua_State): Integer; cdecl;
var
c : TTestClass;
propName : String;
v : Variant;
begin
c := Check(L, 1);
lua_remove(L, 1);
propName := LuaToString(L, 1);
if IsPublishedProp(c, propName) then
begin
v := GetPropValue(c, propName);
LuaPushVariant(L, v);
end
else
luaL_error(L, PChar('Property "'+propName+'" does not exist'));
result := 1;
end;

function newindexTestClass(LLua_State): Integer; cdecl;
var
c : TTestClass;
propName : String;
v : Variant;
begin
c := Check(L, 1);
lua_remove(L, 1);
propName := LuaToString(L, 1);
v := LuaToVariant(L, 2);
if IsPublishedProp(c, propName) then
SetPropValue(c, propName, v)
else
luaL_error(L, PChar('Property "'+propName+'" does not exist'));
result := 0;
end;

function luaDeposit(L: Plua_State): Integer; cdecl;
var
c : TTestClass;
begin
c := Check(L, 1);
lua_remove(L, 1);
if lua_type(L, 1)<>LUA_TNUMBER then
luaL_error(L, 'Deposit expects one parameter (Amount) that should be an integer.')
else
c.Deposit(lua_tonumber(L, 1));
result := 0;
end;

function luaWithdraw(L: Plua_State): Integer; cdecl;
var
c : TTestClass;
begin
c := Check(L, 1);
lua_remove(L, 1);
if lua_type(L, 1)<>LUA_TNUMBER then
luaL_error(L, 'Withdraw expects one parameter (Amount) that should be an integer.')
else
c.Withdraw(lua_tonumber(L, 1));
result := 0;
end;

{ TTestClass }

procedure TTestClass.Deposit(Amount: Double);
begin
FBalance := FBalance + Amount;
end;

class procedure TTestClass.RegisterTo(LuaScript: TLUA);
var
MetaTable,
MethodTable,
Methods : Integer;
begin
lua_newtable(LuaScript.LuaState);
Methods := lua_gettop(LuaScript.LuaState);

luaL_newmetatable(LuaScript.LuaState, LuaClassName);
MetaTable := lua_gettop(LuaScript.LuaState);

lua_pushstring(LuaScript.LuaState, LuaClassName);
lua_pushvalue(LuaScript.LuaState, Methods);
lua_settable(LuaScript.LuaState, LUA_GLOBALSINDEX);

lua_pushliteral(LuaScript.LuaState, '__metatable');
lua_pushvalue(LuaScript.LuaState, Methods);
lua_settable(LuaScript.LuaState, metatable);

lua_pushliteral(LuaScript.LuaState, '__index');
lua_pushcfunction(LuaScript.LuaState, indexTestClass);
lua_settable(LuaScript.LuaState, MetaTable);

lua_pushliteral(LuaScript.LuaState, '__newindex');
lua_pushcfunction(LuaScript.LuaState, newindexTestClass);
lua_settable(LuaScript.LuaState, MetaTable);

lua_pushliteral(LuaScript.LuaState, '__gc');
lua_pushcfunction(LuaScript.LuaState, gc_TestClass);
lua_settable(LuaScript.LuaState, MetaTable);

lua_newtable(LuaScript.LuaState);
MethodTable := lua_gettop(LuaScript.LuaState);
lua_pushliteral(LuaScript.LuaState, '__call');
lua_pushcfunction(LuaScript.LuaState, new_TestClass);
lua_pushliteral(LuaScript.LuaState, 'new');
lua_pushvalue(LuaScript.LuaState, -2);
lua_settable(LuaScript.LuaState, Methods);
lua_settable(LuaScript.LuaState, MethodTable);
lua_setmetatable(LuaScript.LuaState, Methods);

//Test Method
lua_pushstring(LuaScript.LuaState, 'Deposit');
lua_pushcfunction(LuaScript.LuaState, luaDeposit);
lua_settable(LuaScript.LuaState, Methods);

lua_pushstring(LuaScript.LuaState, 'Withdraw');
lua_pushcfunction(LuaScript.LuaState, luaWithdraw);
lua_settable(LuaScript.LuaState, Methods);
//End of Test Method}

lua_pop(LuaScript.LuaState, 2);
end;

procedure TTestClass.SetBalance(const Value: Double);
begin
FBalance := Value;
end;

procedure TTestClass.Withdraw(Amount: Double);
begin
FBalance := FBalance - Amount;
end;

end.[/pascal]