*/ private $reason_codes; /** * Constructor. * * @param string $status Result status. * @param array $reason_codes Safe internal reason codes. */ private function __construct( string $status, array $reason_codes = array() ) { $this->status = $status; $this->reason_codes = $this->filter_reason_codes( $reason_codes ); } /** * Create a passing result. */ public static function pass(): self { return new self( self::STATUS_PASS ); } /** * Create a suspicious result. * * @param string $reason_code Safe internal reason code. */ public static function suspicious( string $reason_code ): self { return new self( self::STATUS_SUSPICIOUS, array( $reason_code ) ); } /** * Create a blocking result. * * @param string $reason_code Safe internal reason code. */ public static function block( string $reason_code ): self { return new self( self::STATUS_BLOCK, array( $reason_code ) ); } /** * Get status. */ public function get_status(): string { return $this->status; } /** * Check if result blocks the submission. */ public function is_blocking(): bool { return self::STATUS_BLOCK === $this->status; } /** * Check if result is suspicious. */ public function is_suspicious(): bool { return self::STATUS_SUSPICIOUS === $this->status; } /** * Get safe internal reason codes. * * @return array */ public function get_reason_codes(): array { return $this->reason_codes; } /** * Keep only stable reason-code-like strings. * * @param array $reason_codes Raw reason codes. * * @return array */ private function filter_reason_codes( array $reason_codes ): array { $filtered = array(); foreach ( $reason_codes as $reason_code ) { if ( preg_match( '/^[a-z0-9_]+$/', $reason_code ) ) { $filtered[] = $reason_code; } } return array_values( array_unique( $filtered ) ); } }