diff --git a/src/applications/differential/mail/base/DifferentialMail.php b/src/applications/differential/mail/base/DifferentialMail.php index 6e506d6486..67b1b963a7 100644 --- a/src/applications/differential/mail/base/DifferentialMail.php +++ b/src/applications/differential/mail/base/DifferentialMail.php @@ -215,27 +215,19 @@ EOTEXT; } public function getReplyHandler() { - if ($this->replyHandler) { - return $this->replyHandler; + if (!$this->replyHandler) { + $this->replyHandler = + self::newReplyHandlerForRevision($this->getRevision()); } - $handler_class = PhabricatorEnv::getEnvConfig( - 'metamta.differential.reply-handler'); - - $reply_handler = self::newReplyHandlerForRevision($this->getRevision()); - - $this->replyHandler = $reply_handler; - return $this->replyHandler; } public static function newReplyHandlerForRevision( DifferentialRevision $revision) { - $handler_class = PhabricatorEnv::getEnvConfig( + $reply_handler = PhabricatorEnv::newObjectFromConfig( 'metamta.differential.reply-handler'); - - $reply_handler = newv($handler_class, array()); $reply_handler->setMailReceiver($revision); return $reply_handler; diff --git a/src/infrastructure/env/PhabricatorEnv.php b/src/infrastructure/env/PhabricatorEnv.php index eb8f22faa0..2e3b6151c8 100644 --- a/src/infrastructure/env/PhabricatorEnv.php +++ b/src/infrastructure/env/PhabricatorEnv.php @@ -22,6 +22,10 @@ final class PhabricatorEnv { private static $env; + private static $requiredClasses = array( + 'metamta.differential.reply-handler' => 'PhabricatorMailReplyHandler', + ); + public static function setEnvConfig(array $config) { self::$env = $config; } @@ -30,6 +34,17 @@ final class PhabricatorEnv { return idx(self::$env, $key, $default); } + public static function newObjectFromConfig($key, $args = array()) { + $class = self::getEnvConfig($key); + $object = newv($class, $args); + $instanceof = idx(self::$requiredClasses, $key); + if (!($object instanceof $instanceof)) { + throw new Exception("Config setting '$key' must be an instance of ". + "'$instanceof', is '".get_class($object)."'."); + } + return $object; + } + public static function envConfigExists($key) { return array_key_exists($key, self::$env); }