def requires_permission(permission_s, logical_operator=all):
        """
        Requires that the calling Subject be authorized to the extent that is
        required to satisfy the permission_s specified and the logical operation
        upon them.

        :param permission_s:   the permission(s) required
        :type permission_s:  a List of Strings or List of Permission instances

        :param logical_operator:  indicates whether all or at least one permission
                                  is true (and, any)
        :type: and OR all (from python standard library)

        Elaborate Example:
            requires_permission(
                permission_s=['domain1:action1,action2', 'domain2:action1'],
                logical_operator=any)

        Basic Example:
            requires_permission(['domain1:action1,action2'])
        """
        def outer_wrap(fn):
            @functools.wraps(fn)
            def inner_wrap(*args, **kwargs):

                subject = WebYosai.get_current_subject()
                try:
                    subject.check_permission(permission_s, logical_operator)

                except ValueError:
                    msg = ("Attempting to perform a user-only operation.  The "
                           "current Subject is NOT a user (they haven't been "
                           "authenticated or remembered from a previous login). "
                           "ACCESS DENIED.")
                    raise WebYosai.get_current_webregistry().raise_unauthorized(msg)

                except AuthorizationException:
                    msg = "Access Denied.  Insufficient Permissions."
                    raise WebYosai.get_current_webregistry().raise_forbidden(msg)

                return fn(*args, **kwargs)
            return inner_wrap
        return outer_wrap