--- /dev/null
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/).
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Permissions\Acl\Assertion;
+
+use Zend\Permissions\Acl\Acl;
+use Zend\Permissions\Acl\Exception\InvalidArgumentException;
+use Zend\Permissions\Acl\Resource\ResourceInterface;
+use Zend\Permissions\Acl\Role\RoleInterface;
+
+class CallbackAssertion implements AssertionInterface
+{
+ /**
+ * @var callable
+ */
+ protected $callback;
+
+ /**
+ * @param callable $callback The assertion callback
+ */
+ public function __construct($callback)
+ {
+ if (! is_callable($callback)) {
+ throw new InvalidArgumentException('Invalid callback provided; not callable');
+ }
+ $this->callback = $callback;
+ }
+
+ /**
+ * Returns true if and only if the assertion conditions are met.
+ *
+ * This method is passed the ACL, Role, Resource, and privilege to which the
+ * authorization query applies.
+ *
+ * If the $role, $resource, or $privilege parameters are null, it means
+ * that the query applies to all Roles, Resources, or privileges,
+ * respectively.
+ *
+ * @param Acl $acl
+ * @param RoleInterface $role
+ * @param ResourceInterface $resource
+ * @param string $privilege
+ *
+ * @return bool
+ */
+ public function assert(
+ Acl $acl,
+ RoleInterface $role = null,
+ ResourceInterface $resource = null,
+ $privilege = null
+ ) {
+ return (bool) call_user_func($this->callback, $acl, $role, $resource, $privilege);
+ }
+}