# Write your own

{% hint style="success" %}
This is the official documentation of the `agent_ruby` Ruby agent.
{% endhint %}

Each Plugin is nothing more than a `class` that implements our `Plugin abstract class` and can perform customizations at either Agent level, Collection level, or both.

```ruby
class RemoveTimestamps < ForestAdminDatasourceCustomizer::Plugins::Plugin
  def run(datasource, collection, options)
    # ... call customization methods here
  end
end
```

3 parameters are provided:

| Name       | Description                                                                                                                                                                                               |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| dataSource | An object that allows customizing the whole agent. It has the same interface than the `Agent` you manipulate outside of Plugins                                                                           |
| collection | An object that allows customizing the collection that the Plugin was called from (`nil` if the Plugin was called on the Agent). It is the same object than is passed when you call `customize_collection` |
| options    | An array of options that are provided to the Plugin. Each Plugin will provide specific mandatory or optional options.                                                                                     |

### Making your Plugin act differently depending on the Collection

When making a Plugin, you may want it to generalize to many different Collections.

This can be achieved by adopting different behavior depending on the `schema` of the Collection being targeted.

```ruby
class RemoveTimestamps < ForestAdminDatasourceCustomizer::Plugins::Plugin
  def run(datasource, _collection, _options)
    datasource.collections.each do |current_collection|
      if current_collection.schema[:fields]['createdAt']
        current_collection.remove_field('createdAt')
      end

      if current_collection.schema[:fields]['updatedAt']
        current_collection.remove_field('updatedAt')
      end
    end
  end
end
```
