from django.conf.urls.defaults import url
from django.utils.decorators import wraps

def func_to_view(f):
    @wraps(f)
    def _dec(request, *a, **kw):
        kwargs = dict(kw)
        for k, v in request.REQUEST.items():
            kwargs[str(k)] = v
        return f(request, *a, **kwargs)
    return _dec

class AjaxAPI(object):
    def url_patterns(self, prefix=''):
        attrs = ((name, getattr(self, name)) for name in dir(self)
                 if not name.startswith('__'))
        methods = ((name, method) for (name, method) in attrs if callable(method))

        res = []
        for name, method in methods:
            exported = getattr(method, 'exported', False)
            if not exported: continue
            if isinstance(exported, basestring):
                export_name = exported
            else:
                export_name = name # Default to exporting by function name
            res.append(url('^%s%s/$' % (prefix, export_name),
                           func_to_view(method)))
        return res

    @staticmethod
    def export(f, name=True):
        f.exported = name
        return f