public static function fetch($arr, $descriptors)
    {
        $args = new ArrArguments($arr);

        foreach ($descriptors as $name => $descriptor) {
            $types = array();
            $default = null;
            $required = false;

            if (is_string($descriptor)) {
                $types = explode("|", $descriptor);
            } elseif (is_array($descriptor)) {
                $types = explode("|", Arr::get($descriptor, "type"));
                $default = Arr::get($descriptor, "default");
                $required = Arr::get(
                    $descriptor, "required", !Arr::exist($descriptor, "default")
                );
            }

            $desc = new ArrArgumentsDescriptor($types, $default, $required);
            $args->registerDescriptor($name, $desc);
        }

        return $args->fetch();
    }