Toluapp Class Access Labels

lua-users home
wiki

Starting from version 1.0.7, tolua++ includes 2 new features that make it easy to implement public, protected and private labels in classes (or any container, including namespaces, modules, and even the main packages).

object access

Every tolua++ object has an access flag, which determines the object's access inside its container. Container objects also have a member called curr_member_access, which determines the access of each child object at the moment of its addition to the container.

An object is considered public when the value of access is nil, false, or 0. Anything else means non-public, and tolua++ doesn't care. The default access value for all objects is nil, so this new feature doesn't affect current users.

parser_hook

The parser_hook is an empty function called at the begining of the main parser function, with the text to parse as a parameter. This function can be reimplemented on a custom lua file and run inside tolua++ using the -L option. Usually a parser function will search the beginning of the string for a token, and if it finds anything, return the string without that token (after doing whatever it has to do with the token). The parser_hook can safely return nil.

Implementing access labels

This example implements the 'parser_hook' to look for labels, and set the curr_member_access to the current access. It also sets curr_member_access to private by default (based on the fact that the default value for curr_member_access is nil). The labels will still work on other containers (modules, namespaces and the main package), but those will still be public by default.

-- access_hook.lua

local access = {public = 0, protected = 1, private = 2}

function preparse_hook(p)
	-- we need to make all structs 'public' by default
	p.code = string.gsub(p.code, "(struct[^;]*{)", "%1\npublic:\n")
end


function parser_hook(s)

        local container = classContainer.curr -- get the current container
        if not container.curr_member_access and container.classtype == 'class' then
                -- default access for classes is private
                container.curr_member_access = access.private
        end

        -- try labels (public, private, etc)
        do
                local b,e,label = string.find(s, "^%s*(%w*)%s*:[^:]") -- we need to check for [^:], otherwise it would match 'namespace::type'
                if b then

                        -- found a label, get the new access value from the global 'access' table
                        if access[label] then
                                container.curr_member_access = access[label]
                        end -- else ?

                        return strsub(s, e) -- normally we would use 'e+1', but we need to preserve the [^:]
                end
        end

end

Usage

$ tolua++ -L access-hook.lua package.pkg


RecentChanges · preferences
edit · history
Last edited January 26, 2006 1:09 am GMT (diff)