@staticmethod<EOL><INDENT>def requires_dynamic_permission(permission_s, logical_operator=all):<DEDENT>
def outer_wrap(fn):<EOL><INDENT>@functools.wraps(fn)<EOL>def inner_wrap(*args, **kwargs):<EOL><INDENT>newperms = [perm.format(**kwargs) for perm in permission_s]<EOL>subject = Yosai.get_current_subject()<EOL>subject.check_permission(newperms, logical_operator)<EOL>return fn(*args, **kwargs)<EOL><DEDENT>return inner_wrap<EOL><DEDENT>return outer_wrap<EOL>
This method requires that the calling Subject be authorized to the extent
that is required to satisfy the dynamic permission_s specified and the logical
operation upon them.  Unlike ``requires_permission``, which uses statically
defined permissions, this function derives a permission from arguments
specified at declaration.

Dynamic permissioning requires that the dynamic arguments be keyword
arguments of the decorated method.

: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)

:raises  AuthorizationException:  if the user does not have sufficient
                                  permission

Elaborate Example:
    requires_permission(
        permission_s=['{kwarg1.domainid}:action1,action2',
                       '{kwarg2.domainid}:action1'],
        logical_operator=any)

Basic Example:
    requires_permission(['{kwarg.domainid}:action1,action2'])