Class with plugins
=============

Class with plugins is an npm module that gives you a class with that allows you to extend its functionality using plugins
that can expose properties on the class or run functions using 'hooks'

Installing
=====

Run npm install

Testing
=====

Run npm test

Usage
=====

Extend the ClassWithPlugins class and call the hook function to allow plugins to hook into certain points in the code
```
import ClassWithPlugins from 'frntnd-class-with-plugins';

class Model extends ClassWithPlugins {

  static get _type() {
    return 'Model';
  }

}
```

Write a plugin, this example clones a model and removes its id -, createdOn - and modifiedOn property
```
import _ from 'lodash';
import ClassWithPlugins from 'frntnd-class-with-plugins';

// 'Model' refers to the static get _type on the class, 'clone' is the name of the plugin
ClassWithPlugins.registerPlugin('Model', 'clone', {

  // expose the 'clone' property on the Model
  expose: ['clone'],

  clone(model) {
    const clone = _.clone(model);

    delete clone[this.idKey];
    delete clone[this.modifiedOnKey];
    delete clone[this.createdOnKey];

    return clone;
  }

});
```

Now to have the plugin be present in you class, make sure it appears in the plugins property of the class (an array of strings)

```
class Model extends ClassWithPlugins {

  constructor(options = {}) {
    options.plugins = ['clone'];
    super(options);
  }

}
```

then, finally, to use the plugin
```
const model = new Model({...});
model.clone({id:3, name: 'bob'});
> {name: 'bob'}
```