/** * Creates a new collector gathering the elements in a collection class * * @param lang.XPClass $class * @return util.data.ICollector */ public static function toCollection(XPClass $class) { return new Collector(function () use($class) { return $class->newInstance(); }, function ($result, $arg) { $result->add($arg); }); }
/** * Add a measurable class * * @param lang.XPClass $class * @param lang.reflect.Method $method * @param var $source * @return util.data.Sequence */ private function permutationOf($class, $method, $source) { if (is_array($source)) { $seq = Sequence::of($source); } else { $seq = Sequence::of($class->getMethod($source)->setAccessible(true)->invoke(null)); } return $seq->map(function ($args) use($class, $method) { return $class->newInstance($method, (array) $args); }); }
/** * Constructor * * @param lang.XPClass $scriptlet * @param string[] args * @param [:string] env */ public function __construct(XPClass $scriptlet, $args, $env = [], $filters = []) { if ($scriptlet->hasConstructor()) { $this->scriptlet = $scriptlet->getConstructor()->newInstance((array) $args); } else { $this->scriptlet = $scriptlet->newInstance(); } foreach ($filters as $filter) { $this->scriptlet->filter($filter); } $this->scriptlet->init(); $this->env = $env; }
/** * Creates a new instance of a given class. If the constructor uses * injection, the arguments are compiled from the relevant annotations. * Otherwise, optional constructor arguments may be passed. * * @param lang.XPClass $class * @param [:var] $named Named arguments * @return var * @throws inject.ProvisionException */ public function newInstance(XPClass $class, $named = []) { if ($class->hasConstructor()) { $constructor = $class->getConstructor(); try { return $constructor->newInstance($this->args($constructor, $named)); } catch (TargetInvocationException $e) { throw new ProvisionException('Error creating an instance of ' . $class->getName(), $e->getCause()); } catch (Throwable $e) { throw new ProvisionException('Error creating an instance of ' . $class->getName(), $e); } } else { return $class->newInstance(); } }