public static function describeTable(AdapterInterface $db, $table, $schema = null)
    {
        $columns = $db->describeColumns($table, $schema);
        $indexes = $db->describeIndexes($table, $schema);
        $references = $db->describeReferences($table, $schema);
        $options = $db->tableOptions($table, $schema);

        return new self([
            'name' => $table,
            'schema' => $schema,
            'columns' => array_map([Column::class, 'fromColumn'], $columns),
            'indexes' => array_map([Index::class, 'fromIndex'], $indexes),
            'references' => array_map([Reference::class, 'fromReference'], $references),
            'options' => $options,
        ]);
    }