proto-typer

ProtoTyper is a helper module to add type verification and event dispatching on property change. Ex: prototyper.d(MyClass.prototype).p('name', 'Jhon').t(String).e()

ProtoTyper

ProtoTyper is a utility module for Node.js. Based on Object.defineProperty, it allows type verification and event dispatching on property change.

Install the module with: npm install proto-typer

var prototyper = require('proto-typer');

(Coming soon)

// In Node.js 
 
'use strict';
 
var prototyper = require('proto-typer'),
    define = prototyper.define,
    util = require('util'),
    Emitter = require('events').EventEmitter;
 
function User() { this.id = 'User01' }
util.inherits(User, Emitter);
 
function Pet() {  }
function Dog() { this._type = 'a dog'; }
function Cat() { this._type = 'a cat, but a REALLY big one'; }
 
util.inherits(Dog, Pet);
util.inherits(Cat, Pet);
 
function Car() {}
 
 
// PROTOTYPES 
prototyper
 
// user 
.define(User.prototype)
.c('v', 2.1).nk.f
.p('id').t(String).e('idChange').f
.p('lastName').t(String).e('nameChange').f
.p('firstName').t(String).e('nameChange').f
.p('toString', getFullName).t(Function).nk.f
.p('birthday').type(Date).e().f
.p('pet').t(Pet).e('petChange').f
.p('extensions').e()
 
 
// pet 
.define(Pet.prototype)
.p('_type', 'an undefined pet').nk.f
.u('type', function() {
    return {
        'get'function() { return this._type; },
        'enumerable': true
    };
});
 
 
// METHODS 
 
function getFullName() {
    return (this.firstName || '')  + (this.lastName && this.firstName ? ' ' : '') + (this.lastName || '');
}
 
 
// USER 
 
var user = new User;
 
user.on(prototyper.CHANGE, function(event) {
    // Do something 
});
 
user.on('nameChange', function (event) {
    console.log('User', event.target.id, 'has changed his name to "' + event.target.toString() + '".');
});
 
user.on('petChange', function(event) {
    console.log(this.toString(), "has a new pet, it's", event.newValue.type, '!');
});
 
user.on('idChange', function(event) {
    console.log('User "' + event.oldValue + '" change his identity to "' + event.newValue + '".');
});
 
user.id = ('User02'); // -> User "User01" change his identity to "User02". 
 
user.firstName = 'Jhon'; // -> User User02 has changed his name to "Jhon". 
user.lastName = 'Doe'; // -> User User02 has changed his name to "Jhon Doe". 
 
user.pet = new Pet; // -> Jhon Doe has a new pet, it's an undefined pet ! 
user.pet = new Dog; // -> Jhon Doe has a new pet, it's a dog ! 
user.pet = new Cat; // -> Jhon Doe has a new pet, it's a cat, but a REALLY big one ! 
 
try {
    user.pet = new Car; // -> It's seems that this car is not a pet 
}catch(e){
    console.log("It seems that this car is not a pet");
}
 
console.log('User version:', user.v);
user.= 2.2; // -> exception 

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.

(Nothing yet)

When event and type are added to property definition, the "private" method automatically created becomes enumerable. (Pull requests are welcome)

Copyright (c) 2013 Valéry Herlaud. Licensed under the MIT license. See the file LICENSE.md in this distribution for more details.