> ## Documentation Index
> Fetch the complete documentation index at: https://bym.lonestill.uk/llms.txt
> Use this file to discover all available pages before exploring further.

# api.Patcher

> Monkey-patching любых функций с автоматической очисткой

Все патчи снимаются при `stop()` автоматически.

## before

```js theme={null}
const unpatch = api.Patcher.before(object, 'method', (args) => {
  args[0] = args[0].toUpperCase(); // модифицируем аргументы на месте
})
```

Вызывается **до** оригинальной функции. Возвращаемое значение игнорируется.

## after

```js theme={null}
const unpatch = api.Patcher.after(object, 'method', (args, ret) => {
  return ret + 1; // undefined — оригинальный результат сохраняется
})
```

Вызывается **после**. Если вернуть не `undefined` — заменяет результат.

## instead

```js theme={null}
const unpatch = api.Patcher.instead(object, 'method', (args, original) => {
  return original(...args) + '!';
})
```

Полная замена. Оригинал вызывается только если ты сам его позвал.

## unpatch

```js theme={null}
const unpatch = api.Patcher.after(obj, 'method', fn);
unpatch(); // снимает только этот патч
```

## unpatchAll

```js theme={null}
api.Patcher.unpatchAll() // снять все патчи плагина вручную
```

## Несколько патчей на один метод

```js theme={null}
api.Patcher.before(obj, 'add', (args) => { args[0] *= 10; });
api.Patcher.after(obj, 'add', (args, ret) => ret + 1000);
// obj.add(2, 3): before 2→20, orig 20+3=23, after 23+1000=1023
```

## Пример

```js theme={null}
BYM.register({ id: 'nav-logger' }, (api) => ({
  start() {
    api.Patcher.after(window.history, 'pushState', (args) => {
      api.Logger.log('Переход:', args[2]);
    });
  },
  stop() {},
}));
```
