diff --git a/src/aura_engine/base/lang.py b/src/aura_engine/base/lang.py new file mode 100644 index 0000000000000000000000000000000000000000..c18141036d7cd2d10dd4071c58964e998b0fc5e6 --- /dev/null +++ b/src/aura_engine/base/lang.py @@ -0,0 +1,49 @@ +# +# Aura Engine (https://gitlab.servus.at/aura/engine) +# +# Copyright (C) 2017-2020 - The Aura Engine Team. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +""" +A collection of Python language utilities. +""" + +import inspect +from functools import wraps + + +def private(member): + """ + @private Decorator. + + Use this to annotate your methods for private-visibility. + + This is an more expressive alternative to the pythonic underscore visibility. + """ + + @wraps(member) + def wrapper(*args): + me = member.__name__ + stack = inspect.stack() + calling_class = stack[1][0].f_locals["self"].__class__.__name__ + calling_method = stack[1][0].f_code.co_name + if calling_method not in dir(args[0]) and calling_method is not me: + msg = f'"{me}(..)" called by "{calling_class}.{calling_method}(..)" is private' + print(msg) + raise Exception(msg) + return member(*args) + + return wrapper