Friendly Class Syntax
Friendly syntax differentiate from basic since it uses a class definition that resamble common java/php/c++ syntax.
It just adds a layer above basic class, working as an adapter.
You have to use lowercase “class” properties of hw-core instead of capitalized “Class” of basic syntax.
How to create a final class:
var $ = HWCore; // just an alias of HWCore
var LastName = $.public.final.class([
    // short-style using args instead of object when only 
    // one method is going to be defined
    $.private("lastName", "Bar"),
    // if you have multiple members with same accessors
    // you can define them passing an object
    $.public({
        getLastName: function () {
            return this.i.lastName;
        },
        setLastName: function (lName) {
            this.i.lastName = lName;
        }
    })
]);
How to create an abstract class:
var FirstName = $.public.abstract.class([
    
    $.protected({firstName: "Foo"}), // it is visible from this class and its childs
    $.public("getFirstName", function () {
        return this.i.firstName;
    })
]);
How to create a class that extends “FirstName” and uses “LastName”:
var MyName = $.public.final.class.extends(FirstName).use(LastName)([
    //$.private("lastName", "Bar"),
    // multiple member declaration under same public accessor ( C/C++ style )
    $.public({
        __construct: function (firstName, lastName, nickName) {
            this.i.firstName = firstName;
            this.i.setLastName(lastName);
            this._s.nickName = nickName;
        },
        // override method of "FirstName" class to add nickname too
        getFirstName: function () {
            // use magic "__super" to access parent method
            return this.__super() + " ( " + this._s.nickName + " )";
        }
    }),
    // override method of "LastName" trait
    $.public("getLastName", function () {
        return "My last name is: " + this.i.lastName;
    }),
    // it's the type-hinting , you can force data-type for this var
    $.private.static("nickName", $.typeHint("string", "baz")),
    // Another way to define type-hint, compatible with multiple members declaration
    $.protected.final({"Date birthDay": new Date('December 17,1990 03:24:00')}),
    // Yet Another way to define type-hint using parameters ( only for single-member declaration)
    $.public.static(String, "getNickName", function () {
        return this._s.nickName;
    })
]);
var myName = new MyName("Hello", "World", "I'm a Class");
// you can compare your class instance with its base
console.log(myName instanceof FirstName); // true
console.log(myName.getFirstName()); // it prints Hello ( I'm a Class )
console.log(myName.getLastName()); // it prints "World"
// access to static members from instance using magic method __st
console.log(myName.__st.getNickName()); // it prints I'm a Class
// access to static method directly from class name
console.log(MyName.getNickName()); // it prints I'm a Class
Another simple example:
var Expr = $.public.class(
    $.protected({
        x: undefined,
        y: undefined
    }),
    $.public("__construct", function (x, y) {
        this.i.x = x;
        this.i.y = y;
    }),
    $.public.final({
        sum: $.typeHint(Number, function () {
            return this.i.x + this.i.y;
        })
    })
);
console.log(new Expr(2, 2).sum()); // 4