Skip to content

Commit

Permalink
Merge pull request #40 from WordPress/add-hooks-via-composition
Browse files Browse the repository at this point in the history
Add Hooks to objects via composition or as a mixin
  • Loading branch information
Adam Silverstein authored Oct 22, 2017
2 parents b16c8ba + 72f19ed commit 2f754e1
Show file tree
Hide file tree
Showing 5 changed files with 306 additions and 300 deletions.
51 changes: 25 additions & 26 deletions packages/hooks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,28 @@ npm install @wordpress/hooks@next --save

API functions can be called via the global `wp.hooks` like this `wp.hooks.addAction()`, etc.

* `addAction( 'hook', 'vendor/plugin/function', callback, priority )`
* `addFilter( 'hook', 'vendor/plugin/function', callback, priority )`
* `removeAction( 'hook', 'vendor/plugin/function' )`
* `removeFilter( 'hook', 'vendor/plugin/function' )`
* `removeAllActions( 'hook' )`
* `removeAllFilters( 'hook' )`
* `doAction( 'hook', arg1, arg2, moreArgs, finalArg )`
* `applyFilters( 'hook', content, arg1, arg2, moreArgs, finalArg )`
* `doingAction( 'hook' )`
* `doingFilter( 'hook' )`
* `didAction( 'hook' )`
* `didFilter( 'hook' )`
* `hasAction( 'hook' )`
* `hasFilter( 'hook' )`


### Background
See ticket [#21170](http://core.trac.wordpress.org/ticket/21170) for more information.


### Features

* Fast and lightweight.
* Priorities system ensures hooks with lower integer priority are fired first.
* Uses native object hash lookup for finding hook callbacks.
* Utilizes insertion sort for keeping priorities correct. Best Case: O(n), worst case: O(n^2)
A lightweight & efficient filter and action manager.

### API Usage

* `addAction( 'hookName', 'functionName', callback, priority )`
* `addFilter( 'hookName', 'functionName', callback, priority )`
* `removeAction( 'hookName', 'functionName' )`
* `removeFilter( 'hookName', 'functionName' )`
* `removeAllActions( 'hookName' )`
* `removeAllFilters( 'hookName' )`
* `doAction( 'hookName', arg1, arg2, moreArgs, finalArg )`
* `applyFilters( 'hookName', content, arg1, arg2, moreArgs, finalArg )`
* `doingAction( 'hookName' )`
* `doingFilter( 'hookName' )`
* `didAction( 'hookName' )`
* `didFilter( 'hookName' )`
* `hasAction( 'hookName' )`
* `hasFilter( 'hookName' )`

Hooks can be added to an object via composition:
`import createHooks from '../';`

`myObject.hooks = createHooks();`

API functions are then be called: `myObject.hooks.addAction()`...
10 changes: 0 additions & 10 deletions packages/hooks/src/hooks.js

This file was deleted.

58 changes: 26 additions & 32 deletions packages/hooks/src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import HOOKS from './hooks';
import createAddHook from './createAddHook';
import createRemoveHook from './createRemoveHook';
import createHasHook from './createHasHook';
Expand All @@ -7,34 +6,29 @@ import createCurrentHook from './createCurrentHook';
import createDoingHook from './createDoingHook';
import createDidHook from './createDidHook';

// Add action/filter functions.
export const addAction = createAddHook( HOOKS.actions );
export const addFilter = createAddHook( HOOKS.filters );

// Remove action/filter functions.
export const removeAction = createRemoveHook( HOOKS.actions );
export const removeFilter = createRemoveHook( HOOKS.filters );

// Has action/filter functions.
export const hasAction = createHasHook( HOOKS.actions );
export const hasFilter = createHasHook( HOOKS.filters );

// Remove all actions/filters functions.
export const removeAllActions = createRemoveHook( HOOKS.actions, true );
export const removeAllFilters = createRemoveHook( HOOKS.filters, true );

// Do action/apply filters functions.
export const doAction = createRunHook( HOOKS.actions );
export const applyFilters = createRunHook( HOOKS.filters, true );

// Current action/filter functions.
export const currentAction = createCurrentHook( HOOKS.actions );
export const currentFilter = createCurrentHook( HOOKS.filters );

// Doing action/filter: true while a hook is being run.
export const doingAction = createDoingHook( HOOKS.actions );
export const doingFilter = createDoingHook( HOOKS.filters );

// Did action/filter functions.
export const didAction = createDidHook( HOOKS.actions );
export const didFilter = createDidHook( HOOKS.filters );
function createHooks() {
const actions = {};
const filters = {};

return {
addAction: createAddHook( actions ),
addFilter: createAddHook( filters ),
removeAction: createRemoveHook( actions ),
removeFilter: createRemoveHook( filters ),
hasAction: createHasHook( actions ),
hasFilter: createHasHook( filters ),
removeAllActions: createRemoveHook( actions, true ),
removeAllFilters: createRemoveHook( filters, true ),
doAction: createRunHook( actions ),
applyFilters: createRunHook( filters, true ),
currentAction: createCurrentHook( actions ),
currentFilter: createCurrentHook( filters ),
doingAction: createDoingHook( actions ),
doingFilter: createDoingHook( filters ),
didAction: createDidHook( actions ),
didFilter: createDidHook( filters ),
actions: actions,
filters: filters,
};
};
export default createHooks;
Loading

0 comments on commit 2f754e1

Please sign in to comment.