traits-decorator
                                
                                 traits-decorator copied to clipboard
                                
                                    traits-decorator copied to clipboard
                            
                            
                            
                        Traits with decorators
traits-decorator
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.