***************************************************************************
@method _aclAndBelow
@description Combines an ACL from a parent endpoint with one from its child.
If the parent ACL has no selfAndBelow configured, only the child
ACL is used.  If selfAndBelow is true, the user must have the
same permission on the parent to access the child.  If
selfAndBelow is the name of a permission (e.g. 'get'), the user
must have that permission on the parent in order to access the
child. If selfAndBelow is a function, it will be invoked with
the user, permission name, and environment as arguments just
like the regular permission functions in order to determine
access.  Assuming the user has access to the parent as defined
above, the child ACL will then be evaluated.  If there is no
child ACL, the user is granted permission by default.
@param {carbond.security.Acl} parentAcl -- The parent endpoint's ACL
@param {carbond.security.Acl} childAcl -- The child endpoint's ACL
@returns {carbond.security.Acl} -- The aggregate ACL for this endpoint
function(parentAcl, childAcl) {
    var self = this
    return o({
      _type: parentAcl.constructor,
      hasPermission: function(user, permission, env) {
        var selfAndBelowFn = self._selfAndBelowFn(parentAcl)
        return (!selfAndBelowFn || selfAndBelowFn(user, permission, env)) &&
          (!childAcl || childAcl.hasPermission(user, permission, env))
      }
    })
  }