from django_jinja.library import render_with

globals = {}
tests = {}
filters = {}
extensions = []

__all__ = ['render_with', 'function', 'filter', 'test', 'extension']


def _store_function(store, func, name=None):
    if name is None:
        name = func.__name__
    store[name] = func


def _register_function(store, name, func):
    if name is None and func is None:
        def decorator(func):
            _store_function(store, func)
            return func

        return decorator
    elif name is not None and func is None:
        if callable(name):
            _store_function(store, name)
            return name
        else:
            def decorator(func):
                _store_function(store, func, name)
                return func

            return decorator
    else:
        _store_function(store, func, name)
        return func


def filter(name=None, func=None):
    return _register_function(filters, name, func)


def function(name=None, func=None):
    return _register_function(globals, name, func)


def test(name=None, func=None):
    return _register_function(tests, name, func)


def extension(cls):
    extensions.append(cls)
    return cls