2013-09-18 21:14:01 +00:00
middleclass
===========
[![Build Status ](https://travis-ci.org/kikito/middleclass.png?branch=master )](https://travis-ci.org/kikito/middleclass)
A simple OOP library for Lua. It has inheritance, metamethods (operators), class variables and weak mixin support.
2013-09-18 22:14:21 +00:00
Quick Look
==========
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
```lua
local class = require 'middleclass'
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
local Fruit = class('Fruit') -- 'Fruit' is the class' name
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
function Fruit:initialize(sweetness)
self.sweetness = sweetness
end
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
Fruit.static.sweetness_threshold = 5 -- class variable (also admits methods)
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
function Fruit:isSweet()
return self.sweetness > Fruit.sweetness_threshold
end
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
local Lemon = class('Lemon', Fruit) -- subclassing
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
function Lemon:initialize()
Fruit.initialize(self, 1) -- invoking the superclass' initializer
end
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
local lemon = Lemon:new()
2013-09-18 21:14:01 +00:00
2014-04-12 01:31:42 +00:00
print(lemon:isSweet()) -- false
```
2013-09-18 21:14:01 +00:00
2013-09-18 22:14:21 +00:00
Documentation
=============
2013-09-18 21:14:01 +00:00
2013-10-10 17:12:15 +00:00
See the [github wiki page ](https://github.com/kikito/middleclass/wiki ) for examples & documentation.
2013-09-18 21:14:01 +00:00
2013-09-18 22:14:21 +00:00
Installation
============
2013-09-18 21:14:01 +00:00
Just copy the middleclass.lua file wherever you want it (for example on a lib/ folder). Then write this in any Lua file where you want to use it:
2014-04-12 01:31:42 +00:00
```lua
local class = require 'middleclass'
```
2013-09-18 21:14:01 +00:00
2013-09-18 22:14:21 +00:00
Specs
=====
2013-09-18 21:14:01 +00:00
This project uses [busted ](http://olivinelabs.com/busted/ ) for its specs. If you want to run the specs, you will have to install it first. Then just execute the following:
2014-04-12 01:31:42 +00:00
```bash
cd /folder/where/the/spec/folder/is
busted
```
2013-09-18 21:14:01 +00:00
2013-09-18 22:14:21 +00:00
Performance tests
=================
2013-09-18 21:14:01 +00:00
Middleclass also comes with a small performance test suite. Just run the following command:
2014-04-12 01:31:42 +00:00
```bash
lua performance/run.lua
```
2013-09-18 21:14:01 +00:00
2013-12-06 20:46:19 +00:00
License
=======
Middleclass is distributed under the MIT license.
2013-09-18 22:14:21 +00:00
Updating from 2.x
=================
2013-09-18 22:10:56 +00:00
2014-01-16 14:38:44 +00:00
Middleclass used to expose several global variables on the main scope. It does not do that anymore.
2013-09-18 22:10:56 +00:00
`class` is now returned by `require 'middleclass'` , and it is not set globally. So you can do this:
2014-04-12 01:31:42 +00:00
```lua
local class = require 'middleclass'
local MyClass = class('MyClass') -- works as before
```
2013-09-18 22:10:56 +00:00
`Object` is not a global variable any more. But you can get it from `class.Object`
2014-04-12 01:31:42 +00:00
```lua
local class = require 'middleclass'
local Object = class.Object
2013-09-18 22:10:56 +00:00
2014-04-12 01:31:42 +00:00
print(Object) -- prints 'class Object'
```
2013-09-18 22:10:56 +00:00
The public functions `instanceOf` , `subclassOf` and `includes` have been replaced by `Object.isInstanceOf` , `Object.static.isSubclassOf` and `Object.static.includes` .
2014-01-16 14:38:44 +00:00
Prior to 3.x:
2013-09-18 22:10:56 +00:00
2014-04-12 01:31:42 +00:00
```lua
instanceOf(MyClass, obj)
subclassOf(Object, aClass)
includes(aMixin, aClass)
```
2013-09-18 22:10:56 +00:00
2014-01-16 14:38:44 +00:00
Since 3.x:
2013-09-18 22:10:56 +00:00
2014-04-12 01:31:42 +00:00
```lua
obj:isInstanceOf(MyClass)
aClass:isSubclassOf(Object)
aClass:includes(aMixin)
```
2013-09-18 22:10:56 +00:00
2014-01-16 14:38:44 +00:00
The 3.x code snippet will throw an error if `obj` is not an object, or if `aClass` is not a class (since they will not implement `isInstanceOf` , `isSubclassOf` or `includes` ).
If you are unsure of whether `obj` and `aClass` are an object or a class, you can use the methods in `Object` . They are prepared to work with random types, not just classes and instances:
2013-09-18 22:10:56 +00:00
2014-04-12 01:31:42 +00:00
```lua
Object.isInstanceOf(obj, MyClass)
Object.isSubclassOf(aClass, Object)
Object.includes(aClass, aMixin)
```
2013-09-18 22:10:56 +00:00
2014-01-16 14:38:44 +00:00
Notice that the parameter order is not the same now as it was in 2.x. Also note the change in naming: `isInstanceOf` instead of `instanceOf` , and `isSubclassOf` instead of `subclassOf` .