diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index b9e218703..72d00d7e6 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -276,7 +276,10 @@ end -- @return #BASE function BASE:GetParent( Child ) local Parent - if rawget( Child, "__" ) then + -- BASE class has no parent + if Child.ClassName == 'BASE' then + Parent = nil + elseif rawget( Child, "__" ) then Parent = getmetatable( Child.__ ).__index else Parent = getmetatable( Child ).__index @@ -284,6 +287,63 @@ function BASE:GetParent( Child ) return Parent end +--- This is the worker method to check if an object is an (sub)instance of a class. +-- +-- ### Examples: +-- +-- * ZONE:New( 'some zone' ):IsInstanceOf( ZONE ) will return true +-- * ZONE:New( 'some zone' ):IsInstanceOf( 'ZONE' ) will return true +-- * ZONE:New( 'some zone' ):IsInstanceOf( 'zone' ) will return true +-- * ZONE:New( 'some zone' ):IsInstanceOf( 'BASE' ) will return true +-- +-- * ZONE:New( 'some zone' ):IsInstanceOf( 'GROUP' ) will return false +-- +-- @param ClassName is the name of the class or the class itself to run the check against +-- @return #boolean +function BASE:IsInstanceOf( className ) + + -- Is className NOT a string ? + if type( className ) ~= 'string' then + + -- Is className a Moose class ? + if type( className ) == 'table' and className.ClassName ~= nil then + + -- Get the name of the Moose class as a string + className = className.ClassName + + -- className is neither a string nor a Moose class, throw an error + else + + -- I'm not sure if this should take advantage of MOOSE logging function, or throw an error for pcall + local err_str = 'className parameter should be a string; parameter received: '..type( className ) + self:E( err_str ) + -- error( err_str ) + return false + + end + end + + className = string.upper( className ) + + if string.upper( self.ClassName ) == className then + return true + end + + local Parent = self:GetParent(self) + + while Parent do + + if string.upper( Parent.ClassName ) == className then + return true + end + + Parent = Parent:GetParent(Parent) + + end + + return false + +end --- Get the ClassName + ClassID of the class instance. -- The ClassName + ClassID is formatted as '%s#%09d'. -- @param #BASE self diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index b1f481ed6..6d9a733da 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -33,6 +33,69 @@ FLARECOLOR = trigger.flareColor -- #FLARECOLOR -- @type UTILS UTILS = {} +--- Function to infer instance of an object +-- +-- ### Examples: +-- +-- * UTILS.IsInstanceOf( 'some text', 'string' ) will return true +-- * UTILS.IsInstanceOf( some_function, 'function' ) will return true +-- * UTILS.IsInstanceOf( 10, 'number' ) will return true +-- * UTILS.IsInstanceOf( false, 'boolean' ) will return true +-- * UTILS.IsInstanceOf( nil, 'nil' ) will return true +-- +-- * UTILS.IsInstanceOf( ZONE:New( 'some zone', ZONE ) will return true +-- * UTILS.IsInstanceOf( ZONE:New( 'some zone', 'ZONE' ) will return true +-- * UTILS.IsInstanceOf( ZONE:New( 'some zone', 'zone' ) will return true +-- * UTILS.IsInstanceOf( ZONE:New( 'some zone', 'BASE' ) will return true +-- +-- * UTILS.IsInstanceOf( ZONE:New( 'some zone', 'GROUP' ) will return false +-- +-- +-- @param object is the object to be evaluated +-- @param className is the name of the class to evaluate (can be either a string or a Moose class) +-- @return #boolean +UTILS.IsInstanceOf = function( object, className ) + -- Is className NOT a string ? + if not type( className ) == 'string' then + + -- Is className a Moose class ? + if type( className ) == 'table' and className.IsInstanceOf ~= nil then + + -- Get the name of the Moose class as a string + className = className.ClassName + + -- className is neither a string nor a Moose class, throw an error + else + + -- I'm not sure if this should take advantage of MOOSE logging function, or throw an error for pcall + local err_str = 'className parameter should be a string; parameter received: '..type( className ) + self:E( err_str ) + return false + -- error( err_str ) + + end + end + + -- Is the object a Moose class instance ? + if type( object ) == 'table' and object.IsInstanceOf ~= nil then + + -- Use the IsInstanceOf method of the BASE class + return object:IsInstanceOf( className ) + else + + -- If the object is not an instance of a Moose class, evaluate against lua basic data types + local basicDataTypes = { 'string', 'number', 'function', 'boolean', 'nil', 'table' } + for _, basicDataType in ipairs( basicDataTypes ) do + if className == basicDataType then + return type( object ) == basicDataType + end + end + end + + -- Check failed + return false +end + --from http://lua-users.org/wiki/CopyTable UTILS.DeepCopy = function(object) diff --git a/docs/Documentation/Base.html b/docs/Documentation/Base.html index e79a06992..032f52796 100644 --- a/docs/Documentation/Base.html +++ b/docs/Documentation/Base.html @@ -257,6 +257,12 @@ BASE:Inherit(Child, Parent)

This is the worker method to inherit from a parent class.

+ + + + BASE.IsInstanceOf(ClassName, self, className) + +

This is the worker method to check if an object is an (sub)instance of a class.

@@ -1220,6 +1226,56 @@ is the Parent class that the Child inherits from.

#BASE: Child

+ + +
+
+ + +BASE.IsInstanceOf(ClassName, self, className) + +
+
+ +

This is the worker method to check if an object is an (sub)instance of a class.

+ + + +

Examples:

+ + + + +

Parameters

+ +

Return value

+ +

#boolean:

+ +
diff --git a/docs/Documentation/Utils.html b/docs/Documentation/Utils.html index 9d8cb3142..13adb0b4a 100644 --- a/docs/Documentation/Utils.html +++ b/docs/Documentation/Utils.html @@ -236,12 +236,41 @@ which are excellent tools to be reused in an OO environment!.

UTILS.FeetToMeters(feet) + + + + UTILS.IsInstanceOf(object, className) + +

Function to infer instance of an object

+ +

Examples:

+ + + + UTILS.KmphToMps(kmph) + + + + UTILS.KnotsToKmph(knots) + + @@ -608,6 +637,56 @@ use negative idp for rounding ahead of decimal place, positive for rounding afte
+ +UTILS.IsInstanceOf(object, className) + +
+
+ +

Function to infer instance of an object

+ +

Examples:

+ +
    +
  • UTILS.IsInstanceOf( 'some text', 'string' ) will return true

  • +
  • UTILS.IsInstanceOf( some_function, 'function' ) will return true

  • +
  • UTILS.IsInstanceOf( 10, 'number' ) will return true

  • +
  • UTILS.IsInstanceOf( false, 'boolean' ) will return true

  • +
  • UTILS.IsInstanceOf( nil, 'nil' ) will return true

  • +
  • UTILS.IsInstanceOf( ZONE:New( 'some zone', ZONE ) will return true

  • +
  • UTILS.IsInstanceOf( ZONE:New( 'some zone', 'ZONE' ) will return true

  • +
  • UTILS.IsInstanceOf( ZONE:New( 'some zone', 'zone' ) will return true

  • +
  • UTILS.IsInstanceOf( ZONE:New( 'some zone', 'BASE' ) will return true

  • +
  • UTILS.IsInstanceOf( ZONE:New( 'some zone', 'GROUP' ) will return false

  • +
+ + + +

Parameters

+
    +
  • + +

    object : +is the object to be evaluated

    + +
  • +
  • + +

    className : +is the name of the class to evaluate (can be either a string or a Moose class)

    + +
  • +
+

Return value

+ +

#boolean:

+ + +
+
+
+
+ UTILS.KmphToMps(kmph) @@ -629,6 +708,27 @@ use negative idp for rounding ahead of decimal place, positive for rounding afte
+ +UTILS.KnotsToKmph(knots) + +
+
+ + + +

Parameter

+
    +
  • + +

    knots :

    + +
  • +
+
+
+
+
+ UTILS.KnotsToMps(knots)