traits-decorator

1.0.1 • Public • Published

traits-decorator

npm version Build Status bitHound Score

Experimental library to apply Traits with ES7 decorators.

Install

using npm

npm i -S traits-decorator

using git repository

npm i -S git://github.com/cocktailjs/traits-decorator

API

Decorators

@traits(Trait1, ...TraitN)

Applicable to class definition. It will apply all the given Traits to the class.

@traits(TExample) class MyClass {}

@requires(description1, ...descriptionN)

Applicable to a method defined in a Trait. The decorator does nothing but it serves as a documentation to reflect what method / property the method needs access to.

class TFoo {
 
    @requires('bar: {String}')
    fooBar() {
        console.log('foo,' + this.bar);
    }
}

Bindings

excludes(Method1, ...MethodN)

Applicable to Trait definition in '@traits'. It will exclude the given method names from the Trait.

@traits(TExample::excludes('foo', 'bar')) 
class MyClass {}

alias(aliases: {})

Applicable to Trait definition in '@traits'. It will alias the method defined in the Trait with the key as the value .

@traits(TExample::alias({baz: 'parentBaz'}))
class MyClass {}

as({alias: {}, excludes: []})

Applicable to Trait definition in '@traits'. It will apply aliases and excluded methods from the Trait

@traits( TExample:as({alias: {baz: 'parentBaz'}, excludes:['foo', 'bar'] }) )
class MyClass {}

Usage

Basically, we have a few Traits (classes) TFirst, TLast and we combine and apply them by using traits decorator:

example.js

'use strict';
 
import { traits, excludes, alias, requires }  from 'traits-decorator'
 
class TFirst {
 
    @requires('collection:[]')
    first() {
        return this.collection[0];
    }
 
}
 
class TLast {
    
    @requires('collection:[]')
    last() {
        let collection = this.collection;
        let l = collection.length;
        return collection[l-1];
    }
 
    justAnother() {}
 
    foo() {
        console.log('from TLast\'s foo');
    }
}
 
//composing a Trait with others
@traits( TFirst, TLast::excludes('foo', 'justAnother') )
class TEnum {
 
    foo() {
        console.log('enum foo')
    }
}
 
//apply trait TEnum
@traits(TEnum::alias({ foo: 'enumFoo' }) )
class MyClass {
 
    constructor (collection: []) {
        this.collection = collection
    }
}
 
let obj = new MyClass([1,2,3])
 
console.log(obj.first()) // 1
 
obj.enumFoo() // enum foo
 

In order to run the example.js we need babel and since we are using some experimental functionality, decorators (@traits) and bindOperator (::) we need to use the --stage 0.

babel-node --stage 0 example.js

Update

@mixins decorator has been removed. If you want to use mixins please use mixins-decorator package.

Readme

Keywords

Package Sidebar

Install

npm i traits-decorator

Weekly Downloads

43

Version

1.0.1

License

MIT

Last publish

Collaborators

  • elmasse