Module jls.lang.class

Provides class creation with inheritance and constructor.

This module provides helper functions to create and work with classes. A class can implement prototype methods shared among all its instances. A class can implement an initialize method that will be called for new instances. A class can inherit from another class, prototype methods are inherited by the subclasses.

Usage:

    local class = require('jls.lang.class')
    local Person = class.create(function(person)
      function person:initialize(name)
        self.name = name
      end
      function person:getName()
        return self.name
      end
    end)
    local luke = Person:new('Luke')
    
    local User = class.create(Person, function(user, super)
      function user:initialize(name, registrationYear)
        super.initialize(self, name)
        self.registrationYear = registrationYear
      end
    end)
    local dave = User:new('Dave', 2012)
    

Functions

getClass (instance) Returns the class of the specified instance.
cloneInstance (instance) Returns a copy of the specified instance.
newInstance (class, ...) Creates a new instance of the specified class.
getName (class) Returns the name of the specified class.
byName (name) Returns the class for the specified name.
isAssignableFrom (class, subclass) Indicates whether or not the specified subclass is the same or a sub class of the specified class.
isClass (value) Returns true if the specified value is a class.
isInstance (class, instance) Indicates whether or not the specified instance is an instance of the specified class.
asInstance (class, ...) Returns an instance of the specified class.
define (class[, defineInstanceFn[, defineClassFn]]) Implements the specified class by setting its prototype and class methods.
modifyInstance (instance, fn) Modifies the specified instance.
create ([super][, defineInstanceFn[, defineClassFn]]) Returns a new class inheriting from specified base class.


Functions

getClass (instance)
Returns the class of the specified instance.

Parameters:

  • instance The instance to get the class from

Returns:

    The class of the specified class or nil if there is no such class

Usage:

    local Vehicle = require('jls.lang.class').create()
    local car = Vehicle:new()
    car:getClass() -- Returns Vehicle
cloneInstance (instance)
Returns a copy of the specified instance. This is a default and best effort implementation, edge case should override it at class level. This method uses serialization, if available, or performs a shallow, field-by-field, copy.

Parameters:

  • instance The instance to clone

Returns:

    A copy of the specified instance, or nil if the instance has no class

Usage:

    local Vehicle = require('jls.lang.class').create()
    local car = Vehicle:new()
    local carCopy = car:clone()
newInstance (class, ...)
Creates a new instance of the specified class.

Parameters:

  • class The class to instantiate
  • ... The parameters passed to the initialize method

Returns:

    A new instance

Usage:

    local Vehicle = require('jls.lang.class').create(function(vehicle)
      function vehicle:initialize(color)
        self.color = color
      end
      function vehicle:getColor()
        return self.color
      end
    end)
    local car = Vehicle:new('blue')
    car:getColor() -- Returns 'blue'
getName (class)
Returns the name of the specified class. This is a default and best effort implementation, edge case should override it at class level.

Parameters:

  • class The class to look for

Returns:

    string The class name or nil if the class is not found in package.loaded
byName (name)
Returns the class for the specified name. A class defined in a module field uses a dollar sign $ to separate the package name and the field name.

Parameters:

  • name string The class name to look for

Returns:

    The class or nil if the class cannot be found
isAssignableFrom (class, subclass)
Indicates whether or not the specified subclass is the same or a sub class of the specified class.

Parameters:

  • class The class to check with
  • subclass The class to be checked

Returns:

    true if the subclass is the same or a sub class of the class, false otherwise

Usage:

    local class = require('jls.lang.class')
    local Vehicle = class.create()
    local Bus = class.create(Vehicle)
    Vehicle:isAssignableFrom(Bus) -- Returns true
isClass (value)
Returns true if the specified value is a class.

Parameters:

  • value The class to check

Returns:

    true if the specified value is a class, false otherwise
isInstance (class, instance)
Indicates whether or not the specified instance is an instance of the specified class.

Parameters:

  • class The class to check with
  • instance The instance to be checked

Returns:

    true if the instance is an instance of the class, false otherwise

Usage:

    local Vehicle = require('jls.lang.class').create()
    local car = Vehicle:new()
    Vehicle:isInstance(car) -- Returns true
asInstance (class, ...)
Returns an instance of the specified class.

Parameters:

  • class The class from which an instance is expected
  • ... The instance to be checked or the creation parameters

Returns:

    An instance
define (class[, defineInstanceFn[, defineClassFn]])
Implements the specified class by setting its prototype and class methods. The following methods are automatically set in the metatable: cease as __close, equals as __eq, finalize as __gc, length as __len, pairs as __pairs, toString as __tostring. The metatable methods cannot be redefined.

Parameters:

  • class The class to implement
  • defineInstanceFn function An optional function that will be called with the class prototype to implement (optional)
  • defineClassFn function An optional function that will be called with the class (optional)

Returns:

    The class

Usage:

    local class = require('jls.lang.class')
    local Person = class.create()
    class.define(function(person)
      function person:initialize(name)
        self.name = name
      end
      function person:getName()
        return self.name
      end
    end, function(Person)
      function Person:getDefaultHeight()
        return 1.75
      end
    end)
    local User = class.create(Person)
    class.define(function(user, super)
      function user:initialize(name, registrationYear)
        super.initialize(self, name)
        self.registrationYear = registrationYear
      end
    end)
    local john = User:new('john', 2011)
    john:getName() -- Returns 'john'
    User:getDefaultHeight() -- Returns 1.75
modifyInstance (instance, fn)
Modifies the specified instance. This method allows to override class methods for a specific instance.

Parameters:

  • instance The instance to modify
  • fn function The function that will be called with the instance and its prototype

Returns:

    The modified instance
create ([super][, defineInstanceFn[, defineClassFn]])
Returns a new class inheriting from specified base class. The class is implemented using the specified functions by calling define. The class has a new method to create new instance and a isInstance method to check compatibility.

Parameters:

  • super An optional base class to inherit from, could be the class name as a string (optional)
  • defineInstanceFn function An optional function that will be called with the class prototype (optional)
  • defineClassFn function An optional function that will be called with the class (optional)

Returns:

    A new class

Usage:

    local Vehicle = class.create()
    local Car = class.create(Vehicle)
    local car = Car:new()
    Vehicle:isInstance(car) -- Returns true
generated by LDoc 1.5.0