Difference between revisions of "32 lines of goodness"

m
 
(4 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{#set:Name=32 lines of goodness}}
+
{{notice|This library has problems when a two classes inherit from the same base class. Check the thread for more details.}}
{{#set:LOVE Version=0.7.2}}
 
{{#set:Description=32 lines of goodness is a small OO library that uses a domain specific language to make a neat syntax so OO is easy.}}
 
  
== The Libary ==
+
== The library ==
 
<source lang="lua">
 
<source lang="lua">
 
local mt_class = {}
 
local mt_class = {}
  
function mt_class:extends(parrent)
+
function mt_class:extends(parent)
   self.super = parrent
+
   self.super = parent
   setmetatable(mt_class, {__index = parrent})
+
   setmetatable(mt_class, {__index = parent})
   parrent.__members__ = parrent.__members__ or {}
+
   parent.__members__ = parent.__members__ or {}
 
   return self
 
   return self
 
end
 
end
Line 39: Line 37:
 
</source>
 
</source>
  
that's all there is to it!! just 32 lines!!
+
That's all there is to it! Just 32 lines!
  
 
== Usage ==
 
== Usage ==
  
slap the above libary in a file of your choose(maybe "32log.lua") and include it in your code using the require function
+
Slap the above library in a file of your choose (maybe "32log.lua") and include it in your code using the <code>require</code> function.
  
the basic syntax is as follows
+
The basic syntax is as follows:
  
 
<source lang="lua">
 
<source lang="lua">
Line 53: Line 51:
 
</source>
 
</source>
  
once a class has been created you can create new instances of the class as follows
+
Once a class has been created you can create new instances of the class as follows:
  
 
<source lang="lua">
 
<source lang="lua">
Line 59: Line 57:
 
</source>
 
</source>
  
if you create a method named __init it can be used to as a constructor with new.
+
If you create a method named <code>__init</code> it can be used to as a constructor with new.
  
 
<source lang="lua">
 
<source lang="lua">
Line 79: Line 77:
 
</source>
 
</source>
  
what ever value you set a member to in the definition, it will act as a default value for the member. this works well with values like numbers and strings where they are always copied by value but tables can get a little tricky,
+
Whatever value you set a member to in the definition, it will act as a default value for the member. This works well with values like numbers and strings where they are always copied by value but tables can get a little tricky:
  
 
<source lang="lua">
 
<source lang="lua">
Line 91: Line 89:
 
</source>
 
</source>
  
classes inherit there parents default member values and meta-methods. you can also call a parents method that was overloaded in the derived class using the super member.
+
Classes inherit their parent's default member values and meta-methods. You can also call a parent's method that was overloaded in the derived class using the <code>super</code> member:
  
 
<source lang="lua">
 
<source lang="lua">
Line 100: Line 98:
 
class "Derived" : extends(Base) {}  
 
class "Derived" : extends(Base) {}  
 
function Derived:foobar()
 
function Derived:foobar()
   self.supper.foobar(self)
+
   self.super.foobar(self)
 
   print("bar")
 
   print("bar")
 
end
 
end
 
</source>
 
</source>
  
 +
== See Also ==
 +
Post any questions you might have in the
 +
[http://love2d.org/forums/viewtopic.php?f=5&t=3344 original post].
  
== See Also ==
+
{{#set:Name=32 lines of goodness}}
post any questions you might have in the original post
+
{{#set:LOVE Version=0.7.2}}
[http://love2d.org/forums/viewtopic.php?f=5&t=3344 original post]
+
{{#set:Description=32 lines of goodness is a small OO library that uses a domain specific language to make a neat syntax so OO is easy.}}
 +
{{#set:Keyword=Class}}
 
[[Category:Libraries]]
 
[[Category:Libraries]]
 +
== Other Languages ==
 +
{{i18n|32 lines of goodness}}

Latest revision as of 14:49, 15 December 2019

O.png This library has problems when a two classes inherit from the same base class. Check the thread for more details.  


The library

local mt_class = {}

function mt_class:extends(parent)
   self.super = parent
   setmetatable(mt_class, {__index = parent})
   parent.__members__ = parent.__members__ or {}
   return self
end

local function define(class, members)
   class.__members__ = class.__members__ or {}
   for k, v in pairs(members) do
      class.__members__[k] = v
   end
   function class:new(...)
      local newvalue = {}
      for k, v in pairs(class.__members__) do
         newvalue[k] = v
      end
      setmetatable(newvalue, {__index = class})
      if newvalue.__init then
         newvalue:__init(...)
      end
      return newvalue
   end
end

function class(name)
    local newclass = {}
   _G[name] = newclass
   return setmetatable(newclass, {__index = mt_class, __call = define})
end

That's all there is to it! Just 32 lines!

Usage

Slap the above library in a file of your choose (maybe "32log.lua") and include it in your code using the require function.

The basic syntax is as follows:

class "ClassName" : extends(BaseClassName) {
    memberName = nonNilValue;
}

Once a class has been created you can create new instances of the class as follows:

local myInstance = ClassName:new()

If you create a method named __init it can be used to as a constructor with new.

class "Vector" {
    x = 0;
    y = 0;
    z = 0;
}
function Vector:__init(x, y, z)
    self.x = x
    self.y = y
    self.z = z
end
function Vector:print()
    print(self.x, self.y, self.z)
end
local vec = Vector:new(1, 0.5, 0.25)
vec:print()

Whatever value you set a member to in the definition, it will act as a default value for the member. This works well with values like numbers and strings where they are always copied by value but tables can get a little tricky:

class "Foo" {
   bar = {};
}
local foo = Foo:new()
foo.bar["foobar"] = 10;
local foo2 = Foo:new()
print(foo2.bar["foobar"])

Classes inherit their parent's default member values and meta-methods. You can also call a parent's method that was overloaded in the derived class using the super member:

class "Base" {}
function Base:foobar()
    print("foo")
end
class "Derived" : extends(Base) {} 
function Derived:foobar()
   self.super.foobar(self)
   print("bar")
end

See Also

Post any questions you might have in the original post.

Other Languages