public function apply($schema, $columns = null, $notation = null)
    {
        //
        if (is_string($schema)) {
            $schema = [
                $schema => is_string($columns)
                    ? [$columns => $notation]
                    : $columns,
            ];
        }

        //
        if (!$schema || count($schema) == 0 || !is_array($schema)) {
            $this->error('generic', 'empty schema not allowed');
        }

        //
        foreach ($schema as $model => $attributes) {
            if (!$attributes || count($attributes) == 0 || !is_array($attributes)) {
                $this->error('generic', "empty model '{$model}' not allowed");
            }
        }

        // retrive queries
        $queries = $this->diff($schema);

        // send all queries to align database
        if (count($queries) > 0) {
            foreach ($queries as $sql) {
                $this->execute($sql);
            }
        }

        return $queries;
    }