Recursively gets value of object or its subobjects property specified by its name.

        The object can be a user defined object, map or array.
        The property name correspondently must be object property, map key or array index.

        :param obj: an object to read property from.

        :param name: a name of the property to get.

        :return: the property value or null if property doesn't exist or introspection failed.

def get_property(obj, name):
        """
        Recursively gets value of object or its subobjects property specified by its name.

        The object can be a user defined object, map or array.
        The property name correspondently must be object property, map key or array index.

        :param obj: an object to read property from.

        :param name: a name of the property to get.

        :return: the property value or null if property doesn't exist or introspection failed.
        """
        if obj == None or name == None:
            return None

        names = name.split(".")
        if names == None or len(names) == 0:
            return None

        return RecursiveObjectReader._perform_get_property(obj, names, 0)