Sample Code: class.lua Source File

Sample Code 0.1 20120518

- Main Page
- Classes
- Files

- File List
- File Members

class.lua
Go to the documentation of this file.
1 ---- Copyright 2011 Simon Dales
2 --
3 -- This work may be distributed and/or modified under the
4 -- conditions of the LaTeX Project Public License, either version 1.3
5 -- of this license or (at your option) any later version.
6 -- The latest version of this license is in
7 -- http://www.latex-project.org/lppl.txt
8 --
9 -- This work has the LPPL maintenance status `maintained'.
10 --
11 -- The Current Maintainer of this work is Simon Dales.
12 --
13
14 --[[!
15 \file
16 \brief enables classes in lua
17 ]]
18
19 --[[ class.lua
20 -- Compatible with Lua 5.1 (not 5.0).
21
22 ---------------------
23
24 ]]--
25 --! \brief ``declare'' as class
26 --!
27 --! use as:
28 --! \code{lua}
29 --! TWibble = class()
30 --! function TWibble.init(instance)
31 --! self.instance = instance
32 --! -- more stuff here
33 --! end
34 --! \endcode
35 --!
36 function class(BaseClass, ClassInitialiser)
37 local newClass = {} -- a new class newClass
38 if not ClassInitialiser and type(BaseClass) == 'function' then
39 ClassInitialiser = BaseClass
40 BaseClass = nil
41 elseif type(BaseClass) == 'table' then
42 -- our new class is a shallow copy of the base class!
43 for i,v in pairs(BaseClass) do
44 newClass[i] = v
45 end
46 newClass._base = BaseClass
47 end
48 -- the class will be the metatable for all its newInstanceects,
49 -- and they will look up their methods in it.
50 newClass.__index = newClass
51
52 -- expose a constructor which can be called by <classname>(<args>)
53 local classMetatable = {}
54 classMetatable.__call =
55 function(class_tbl, ...)
56 local newInstance = {}
57 setmetatable(newInstance,newClass)
58 --if init then
59 -- init(newInstance,...)
60 if class_tbl.init then
61 class_tbl.init(newInstance,...)
62 else
63 -- make sure that any stuff from the base class is initialized!
64 if BaseClass and BaseClass.init then
65 BaseClass.init(newInstance, ...)
66 end
67 end
68 return newInstance
69 end
70 newClass.init = ClassInitialiser
71 newClass.is_a =
72 function(this, klass)
73 local thisMetabable = getmetatable(this)
74 while thisMetabable do
75 if thisMetabable == klass then
76 return true
77 end
78 thisMetabable = thisMetabable._base
79 end
80 return false
81 end
82 setmetatable(newClass, classMetatable)
83 return newClass
84 end
85 --eof