/**
  * Register an implementation
  *
  * @param   string algorithm
  * @param   lang.XPClass<security.checksum.MessageDigestImpl> class
  * @throws  lang.IllegalArgumentException
  */
 public static function register($algorithm, \lang\XPClass $impl)
 {
     if (!$impl->isSubclassOf('security.checksum.MessageDigestImpl')) {
         throw new \lang\IllegalArgumentException('Implementation class must be a security.checksum.MessageDigestImpl');
     }
     self::$implementations[$algorithm] = $impl;
 }
 /**
  * Register an algorithm
  *
  * @param   string name
  * @param   lang.XPClass<security.password.Algorithm> impl
  * @throws  lang.IllegalArgumentException in case the given class is not an Algorithm 
  */
 public static function setAlgorithm($name, \lang\XPClass $impl)
 {
     if (!$impl->isSubclassOf('security.password.Algorithm')) {
         throw new \lang\IllegalArgumentException('Given argument is not an Algorithm class (' . \xp::stringOf($impl) . ')');
     }
     self::$algorithms[$name] = $impl;
 }
 /**
  * Register transport implementation for a specific scheme
  *
  * @param   string scheme
  * @param   lang.XPClass<peer.http.HttpTransport> class
  */
 public static function register($scheme, XPClass $class)
 {
     if (!$class->isSubclassOf('peer.http.HttpTransport')) {
         throw new \lang\IllegalArgumentException(sprintf('Given argument must be lang.XPClass<peer.http.HttpTransport>, %s given', $class->toString()));
     }
     self::$transports[$scheme] = $class;
 }
 /**
  * Get all test cases
  *
  * @param   lang.XPClass class
  * @param   var[] arguments
  * @return  unittest.TestCase[]
  */
 public function testCasesInClass(\lang\XPClass $class, $arguments = null)
 {
     // Verify we were actually given a testcase class
     if (!$class->isSubclassOf('unittest.TestCase')) {
         throw new \lang\IllegalArgumentException('Given argument is not a TestCase class (' . \xp::stringOf($class) . ')');
     }
     // Add all tests cases
     $r = [];
     foreach ($class->getMethods() as $m) {
         $m->hasAnnotation('test') && ($r[] = $class->getConstructor()->newInstance(array_merge((array) $m->getName(true), (array) $arguments)));
     }
     // Verify we actually added tests by doing this.
     if (empty($r)) {
         throw new \util\NoSuchElementException('No tests found in ' . $class->getName());
     }
     return $r;
 }
 /**
  * Register a driver
  *
  * Usage:
  * <code>
  *   DriverManager::register('mydb', XPClass::forName('my.db.Connection'));
  *   // [...]
  *   $conn= DriverManager::getConnection('mydb://...');
  * </code>
  *
  * @param   string name identifier
  * @param   lang.XPClass<rdbms.DBConnection> class
  * @throws  lang.IllegalArgumentException in case an incorrect class is given
  */
 public static function register($name, \lang\XPClass $class)
 {
     if (!$class->isSubclassOf('rdbms.DBConnection')) {
         throw new \lang\IllegalArgumentException(sprintf('Given argument must be lang.XPClass<rdbms.DBConnection>, %s given', $class->toString()));
     }
     self::$instance->drivers[$name] = $class;
     self::$instance->lookup = [];
 }