# Write your own

{% hint style="success" %}
This is the official documentation of the `forestadmin/laravel-forestadmin` v2+ and `forestadmin/symfony-forestadmin` PHP agents.
{% endhint %}

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

```php
<?php

namespace ...;

use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceCustomizer\DatasourceCustomizer;

class RemoveTimestamps implements Plugin
{
    public function run(DatasourceCustomizer $datasourceCustomizer, ?CollectionCustomizer $collectionCustomizer = null, $options = []): void
    {
       // ... call customization methods here
    }
}
```

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 (`null` if the Plugin was called on the Agent). It is the same object than is passed when you call `customizeCollection` |
| 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.

```php
<?php

namespace ...;

use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceCustomizer\DatasourceCustomizer;

class RemoveTimestamps implements Plugin
{
    public function run(DatasourceCustomizer $datasourceCustomizer, ?CollectionCustomizer $collectionCustomizer = null, $options = []): void
    {
        foreach ($datasourceCustomizer->getCollection() as $currentCollection) {
            if ($currentCollection->getFields()['createdAt']) {
                $currentCollection->removeField('createdAt');
            }

            if ($currentCollection->getFields()['updatedAt']) {
                $currentCollection->removeField('updatedAt');
            }
        }
    }
}
```
