name = $name; } function validate(mtgMetaInfo $meta) {} function __toString() { $str = "func "; $str .= $this->name.'('; foreach($this->getArgs() as $arg) $str .= $arg->getType() . ','; $str = rtrim($str, ','); $str .= ')'; if($ret_type = $this->getReturnType()) $str .= ':'.$ret_type; return $str; } function setReturnType(mtgTypeRef $type) { $this->ret_type = $type; } function getReturnType() : ?mtgType { return $this->ret_type ? $this->ret_type->resolve() : null; } function getName() : string { return $this->name; } function getArgs() { return $this->args; } function setArgs(array $args) { foreach($args as $arg) $this->addArg($arg); } function addArg(mtgMetaField $arg) { if($this->hasArg($arg->getName())) throw new Exception("Func '{$this->name}' already has arg '{$arg->getName()}'"); $this->args[$arg->getName()] = $arg; } function hasArg($name) { return isset($this->args[$name]); } function getArg($name) { if(!isset($this->args[$name])) throw new Exception("No such arg '$name'"); return $this->args[$name]; } }