[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lua-l
Subject:    Re: Re[2]: Privacy
From:       Rici Lake <lua () ricilake ! net>
Date:       2005-05-30 16:54:48
Message-ID: eacc9936adc1b6b8123601e1a6e1fdc0 () ricilake ! net
[Download RAW message or body]

It's easy enough to create a table with non-iterable keys.
Simply put the non-iterable keys in another table, and make that the 
metatable.
Something like this:


static const luaL_reg banklib[] = {
    {"CurrenAccount", curAcc},
    {"CurrentPassword", curPwd},
    {NULL, NULL}
};

static const luaL_reg prot_banklib[] = {
    {"GetAdminPassword", adminPwd},
    {NULL, NULL};
};

luaL_openlib(L, "bank", banklib, 0);

luaL_openlib(L, NULL, prot_banklib, 0);

lua_pushliteral(L, "__index");
lua_pushvalue(L, -2);
lua_settable(L, -3);

lua_pushliteral(L, "__metatable");
lua_pushboolean(L, 0);
lua_settable(L, -3);

lua_setmetatable(L, -2);

-----

But what does that buy you, really? In the end, they can still call the 
function. They just need to know it's name.

So you could make the name itself unavailable, by using a table as a 
key instead of a string. Then only functions which you give the key to 
would be able to use it. But I think a simpler approach is to reverse 
the above; the administrative bank library has the protected 
interfaces, with the regular bank library as its __index meta. Then you 
give the admin table to functions you want to have access to the admin 
library, and the regular one to everyone else.

On 30-May-05, at 2:23 AM, Stukov wrote:

> Hello Edwin,
>
> EEM> Mayber you can check out Programming in Lua
> EEM> and read the part on object orientation:
>
> EEM> http://www.lua.org/pil/16.html
>
> It's a case if class privacy.
> I need 'interface' privacy.
>
> Example:
>
> somecode.c ----------
>
>   lua_State* L;
>
>   static const luaL_reg banklib[] = {
>          {"CurrenAccount", curAcc},
>          {"CurrentPassword", curPwd},
>          {"GetAdminPassword", adminPwd},
>          {NULL, NULL}
>   };
>
>   luaL_openlib(L, "bank", banklib, 0);
>
> ----------------
>
> script.lua      ------------
>
>     for line in pairs(bank) do
>       print(line)
>     end
>
> ------------
>
>
>
> output:
>        CurrenAccount
>        CurrentPassword
>        GetAdminPassword
>
> But I want to hide 'GetAdminPassword' from ENUMERATING.
>
> Of course, if user knows that 'bank' table has method 
> 'GetAdminPassword', he
> can call it.
>
> -- 
> Best regards,
> Stukov
> mailto:Stukov@gala.net


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic