/**
  * @param ColumnsInterface|DataInterface|ModelInterface $config
  * @return mixed
  */
 public function apply($config)
 {
     if (!($config instanceof ColumnsInterface && $config instanceof DataInterface && $config instanceof ModelInterface)) {
         return;
     }
     $allowed = $config->columns();
     if ($config instanceof OtherColumnsInterface) {
         $allowed = $allowed->merge($config->otherColumns()->all())->unique();
     }
     if ($allowed->count() == 0) {
         return;
     }
     if ($columns = $config->data()->get('columns', false)) {
         $columns = $columns == '*' ? $allowed->all() : $allowed->intersect(explode(',', $columns))->all();
     }
     if ($without = $config->data()->get('withoutColumns', false)) {
         $columns = $allowed->diff(explode(',', $without))->all();
     }
     $model = $columns && count($columns) > 0 ? $config->model()->select($columns) : $config->model()->select($config->columns()->all());
     //echo $model->toSql(); exit;
     $config->model($model);
 }