Dumb::class, 'figlet' => Figlet::class, 'image' => Image::class, 'recaptcha' => ReCaptcha::class, ]; /** * Create a captcha adapter instance * * @param iterable $options * @return AdapterInterface * @throws Exception\InvalidArgumentException For a non-array, non-Traversable $options. * @throws Exception\DomainException If class is missing or invalid. */ public static function factory($options) { if ($options instanceof Traversable) { $options = ArrayUtils::iteratorToArray($options); } if (! is_array($options)) { throw new Exception\InvalidArgumentException(sprintf( '%s expects an array or Traversable argument; received "%s"', __METHOD__, get_debug_type($options) )); } if (! isset($options['class'])) { throw new Exception\DomainException(sprintf( '%s expects a "class" attribute in the options; none provided', __METHOD__ )); } $class = $options['class']; if (isset(static::$classMap[strtolower($class)])) { $class = static::$classMap[strtolower($class)]; } if (! class_exists($class)) { throw new Exception\DomainException(sprintf( '%s expects the "class" attribute to resolve to an existing class; received "%s"', __METHOD__, $class )); } unset($options['class']); if (isset($options['options'])) { $options = $options['options']; } $captcha = new $class($options); if (! $captcha instanceof AdapterInterface) { throw new Exception\DomainException(sprintf( '%s expects the "class" attribute to resolve to a valid %s instance; received "%s"', __METHOD__, AdapterInterface::class, $class )); } return $captcha; } }