1
0
Fork 0
Commit Graph

1125 Commits (ab8cdfa1738414849ab24c4e455f58e5e98a8f12)

Author SHA1 Message Date
Mike Gerwitz ab8cdfa173
Remove deleted README files from dist
Replace with their equivalents.
2015-10-25 22:54:45 -04:00
Mike Gerwitz bd3aa85645
Support for trait class supertype method overrides
See the specific commit for more information as part of the commit message.
2015-10-25 22:44:50 -04:00
Mike Gerwitz 47d51fd5da
Provide useful error on attempt to mix in non-trait
Before this change, mixin attempts would fail at the time of mixin when
easejs attempts to invoke the `__mixin` method on the object.  This is both
cryptic and void of any useful information on the stack.
2015-10-25 22:15:34 -04:00
Mike Gerwitz d9b86c1544
Support for trait class supertype overrides
Traits can now override methods of their class supertypes.  Previously, in
order to override a method of some class `C` by mixing in some trait `T`,
both had to implement a common interface.  This had two notable downsides:

  1. A trait that was only compatible with details of `C` could only work
     with `C#M` if it implemented an interface `I` that declared `I#M`.
     This required the author of `C` to create interfaces where they would
     otherwise not be necessary.

  2. As a corollary of #1---since methods of interfaces must be public, it
     was not possible for `T` to override any protected method of `C`; this
     meant that `C` would have to declare such methods public, which may
     break encapsulation or expose unnecessary concerns to the outside
     world.

Until documentation is available---hopefully in the near future---the test
cases provide detailed documentation of the behavior.  Stackable traits work
as you would expect:

```javascript
var C = Class(
{
    'virtual foo': function()
    {
        return 'C';
    },
} );

var T1 = Trait.extend( C,
{
    'virtual abstract override foo': function()
    {
        return 'T1' + this.__super();
    },
} );

var T2 = Trait.extend( C,
{
    'virtual abstract override foo': function()
    {
        return 'T2' + this.__super();
    },
} );

C.use( T1 )
    .use( T1 )
    .use( T2 )
    .use( T2 )
    .foo();
// result: "T2T2T1T1C"
```

If the `override` keyword is used without `abstract`, then the super method
is statically bound to the supertype, rather than being resolved at runtime:

```javascript
var C = Class(
{
    'virtual foo': function()
    {
        return 'C';
    },
} );

var T1 = Trait.extend( C,
{
    'virtual abstract override foo': function()
    {
        return 'T1' + this.__super();
    },
} );

var T2 = Trait.extend( C,
{
    // static override
    'virtual override foo': function()
    {
        return 'T2' + this.__super();
    },
} );

C.use( T1 )
    .use( T1 )
    .use( T2 )
    .use( T2 )
    .foo();
// result: "T2C"
```

This latter form should be discouraged in most circumstances (as it prevents
stackable traits), but the behavior is consistent with the rest of the
system.

Happy hacking.
2015-10-24 23:53:23 -04:00
Mike Gerwitz 02e8b796ee
Documentation compatibility with Texinfo 5.2
I upgraded Texinfo recently and found that ease.js' documentation would no
longer compile.  The errors make sense, but it's an unfortunate regression.
The previous version that I was using was 4.13, which is quite old.
2015-10-17 00:11:28 -04:00
Mike Gerwitz 50500ed290
ES6-style constructor documentation
Shame on me for not including this in the previous merge!
2015-09-16 00:39:26 -04:00
Mike Gerwitz 0e26f9fd0f Strip `public` keyword from __construct in docs
It must be public, so by convention, I don't include it anymore.  But this
is personal preference.
2015-09-16 00:38:04 -04:00
Mike Gerwitz 90aa74d0cb ES6-style constructor added to documentation 2015-09-16 00:37:24 -04:00
Mike Gerwitz cbf98cccf1
ES6-style constructors
Included with this change is a simple "wrapper" implementation:

```
// equivalent
easejs( Foo );
Class.extend( Foo, {} );
```
2015-09-16 00:15:50 -04:00
Mike Gerwitz d3f1f0dee2 Add test to ensure multiple constructors cannot be defined 2015-09-16 00:02:02 -04:00
Mike Gerwitz ba2605f836 Alias `constructor` member to `__construct`
This allows ease.js classes to mimic the structure of ES6 classes, which use
`constructor` to denote the constructor.  This patch simply aliases it to
`__construct`, which ease.js handles as it would normally.

To that note, since the ES6 `class` keyword is purely syntatic sugar around
the prototype model, there is not much benefit to using it over ease.js if
benefits of ease.js are still desired, since the member definition syntax is
a feature of object literals:

```
// ease.js using ES6
let Person = Class(
{
    _name: '',

    // note that __construct still works as well
    constructor( name ) {
      this._name = ''+name;
    },

    sayHi() {
      return "Hi, I'm " + this.getName();
    },

    // keywords still work as expected
    'protected getName'() {
      return this._name;
    }
} );

// ES6 using `class` keyword
class Person
{
    // note that ES6 will _not_ make this private
    _name: '',

    constructor( name ) {
      this._name = ''+name;
    },

    sayHi() {
      return "Hi, I'm " + this.getName();
    }

    // keywords unsupported (you'd have to use Symbols)
    getName() {
      return this._name;
    }
}

// ES3/5 ease.js
var Person = Class(
{
    _name: '',

    __construct: function( name ) {
      this._name = ''+name;
    },

    sayHi: function() {
      return "Hi, I'm " + this._name;
    },

    'protected getName': function() {
      return this._name;
    }
} );
```

As you can see, the only change between writing ES6-style method definitions
is the syntax; all keywords and other features continue to work as expected.
2015-09-16 00:02:00 -04:00
Mike Gerwitz a931796bdf Prototype wrapping using index function
This redefines the index as a function (rather than a vanilla object) so
that it may be invoked to yield an ease.js Class that wraps the given
prototype.
2015-09-09 23:36:14 -04:00
Mike Gerwitz 1fe8a0e8d6
Remove interactive.js jQuery dependency
Importantly, this also removes loading from ajax.googleapis.com, which is a
problem, because the domain must be allowed using NoScript, and hosts many
other things.

Why this was added to begin with is beyond me.  Perhaps it demonstrates my
novice abilities back in the day.
2015-08-23 00:37:24 -04:00
Mike Gerwitz 62f7e0111a
README.md et. al. restructuring
There is now only one README* file---README.md.  Other files have been
renamed (e.g. README.hacking=>HACKING), or consolidated.
2015-08-23 00:15:48 -04:00
Mike Gerwitz 4a61781701
Browserify fix 2015-08-14 14:00:27 -04:00
Mike Gerwitz fdc2f2e3c3 __dirname removal from index.js
This satisfies Browserify, which apparently does not like __dirname
2015-08-14 13:46:20 -04:00
Mike Gerwitz 1d828b7ee2
LibreJS license header for doc/interactive.js 2015-07-06 23:42:53 -04:00
Mike Gerwitz b91d243e2b
package.json updates 2015-05-28 23:55:19 -04:00
Mike Gerwitz a1c2fbeaa4 package.json engines removed; unnecessary 2015-05-28 23:54:35 -04:00
Mike Gerwitz 32d004bee7 package.json repo URL update to HTTP
Browsable and less likely to be blocked by corporate firewalls.
2015-05-28 23:53:32 -04:00
Mike Gerwitz 6c6a3af03d package.json author e-mail update 2015-05-28 23:50:37 -04:00
Mike Gerwitz 579527d168
Class is not a needed dependency for Interface 2015-05-28 01:23:52 -04:00
Mike Gerwitz db3ade378a
[copyright] Copyright update 2015-05-28 01:01:51 -04:00
Mike Gerwitz 7ce57b7d97
Trait class extend support 2015-05-28 00:01:24 -04:00
Mike Gerwitz c27400ca83 README.traits "Trait Extending" section update to reflect class extension support 2015-05-27 23:40:30 -04:00
Mike Gerwitz f3a8dea25d Test ensuring `#use` staging object satisfies `Class.isClass` 2015-05-27 23:38:07 -04:00
Mike Gerwitz 867127ed2f Trait class extension support
"Extending" a class C simply creates a contract stating that the trait may
only be mixed into something of type C (so, C or its subtypes).
2015-05-27 23:23:47 -04:00
Mike Gerwitz 96c5a702ce Abstract mixin initial implementation 2015-05-27 23:23:47 -04:00
Mike Gerwitz 5b6a0c0bb5 "lazy" metadata support 2015-05-27 23:23:47 -04:00
Mike Gerwitz e866f53d4c Remove global _extending state
The previous implementation could not survive recursive applications, which
I did know about.  But that was before the system was brutally abused by
traits.
2015-05-27 23:23:47 -04:00
Mike Gerwitz 69e9828beb Object class masquerading 2015-05-27 23:23:47 -04:00
Mike Gerwitz 98e76be94f
Implementation note on this.__super scope with private method calls 2015-05-27 23:23:26 -04:00
Mike Gerwitz c896bdbc27
.mailmap updated with mtg@gnu.org 2015-05-11 23:11:25 -04:00
Mike Gerwitz 1ed7bd0e8b
package.json syntax correction (oops)
Was not able to rebase because I already stupidly pushed, and Savannah does
not allow --force, or deleting `master' to circumvent. ;)  Not that it would
be a good idea rergardless.
2015-05-10 01:39:12 -04:00
Mike Gerwitz d955d6e86a
package.json keyword additions and corrections 2015-05-10 01:27:27 -04:00
Mike Gerwitz a3add011fb package.json keyword additions
This list has also been sorted, so pay close attention to the diff.
2015-05-10 01:27:10 -04:00
Mike Gerwitz dcbe48d982 package.json {tags=>keywords}
Was the key "tags" in the past?  Regardless, it doesn't work [anymore], so
ease.js keywords haven't been searchable in npm for quite some time /
forever.
2015-05-10 01:24:22 -04:00
Mike Gerwitz fcdfae68b2
tools/copyright ignore `.|..' 2015-05-06 22:36:52 -04:00
Mike Gerwitz 991f4086fa
Remove Trait/ParameterTest ctor ordering comment (since resolved) 2015-05-06 22:32:55 -04:00
Mike Gerwitz 313a51d750
README TODOs using Org mode
Even if you don't use Emacs, the outline style should be intuitive.

This commit is partially for organization, partially to let people
know that this project is still on my mind and will be getting more
attention soon.
2014-12-19 22:25:18 -05:00
Mike Gerwitz ee85b058df
Various ES3-related bugfixes for bugs introduced by v0.2.3
GNU ease.js remains committed to supporting environments as far back as ES3;
unfortunately, this is important due to the popularity of older IE versions
(IE<=8). Btw, ease.js runs on IE 5.5, in case you still need that. ;)

But please don't use a proprietary web browser. Indeed, this is why the
breaks were introduced in the first place: I neglected to run the
browser-based test suite on the proprietary Microsloth browsers until after
the v0.2.3 release, because I do not own a copy of Windows; I had to run it
at work. But, regardless---my apologies; I'll be more diligent.
2014-08-07 22:57:14 -04:00
Mike Gerwitz a5c89565fe `undefined` is no longer applied to Trait.__mixin
This is a bugfix; the bug was introduced in v0.2.3.

Notably, this caused problems in IE<=8 for non-argument traits. The problem
is that `fund.apply( x, undefined )` is not valid in ES3---we must apply an
empty array (or argument list) instead.
2014-08-07 22:53:10 -04:00
Mike Gerwitz 324ff5ddca Global no longer uses root as alt object prototype
This is a bugfix; the bug was introduced in v0.2.3.

Initially, the implementation created a new object with the root object as
its prototype, taking advantage of ECMAScript's native
overrides/fallthroughs. Unfortunately, IE<=8 had a buggy implementation,
effectively treating the prototype as an empty object. So, rather than
alt.Array === root.Array, alt.Array === undefined.

The fix is simply to reference discrete objects.
2014-08-07 22:33:04 -04:00
Mike Gerwitz d0ec7aca9b method.super references now ES3-compatible
This is a bugfix; the bug was introduced in v0.2.3.

In ECMAScript 5, reserved keywords can be used to reference the field of an
object in dot notation (e.g. method.super), but in ES3 this is prohibited;
in these cases, method['super'] must be used. To maintain ES3 compatiblity,
GNU ease.js will use the latter within its code.

Of course, if you are developing software that need not support ES3, then
you can use the dot notation yourself in your own code.

This does not sway my decision to use `super`---ES3 will soon (hopefully)
become extinct, and would be already were it not for the terrible influence
of Microsloth's outdated browsers.
2014-08-07 22:24:25 -04:00
Mike Gerwitz cef45cd097
Corrected test broken by Node.js v0.10.27
Specifically, aae51ecf, which introduces deepEqual changes for comparing
argument objects---specifically, this change:

```c
  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
    return false;
```

Since I was comparing an array with an arguments object, deepEqual failed.
While such an implementation may confuse users---since argument objects are
generally treated like arrays---the distinction is important and I do agree
with the change.
2014-08-07 00:01:59 -04:00
Mike Gerwitz bbfac76c34
Interface.isInstanceOf now accounts for interface interop
More information in the merged commit message.
2014-08-06 23:09:15 -04:00
Mike Gerwitz b9ba6388d2 Interface.isInstanceOf will account for interop compatibility
This is a bug fix.

If the provided object's constructor is an ease.js type, then the
conventional rules will apply (as mentioned in the test docblock and in the
manual); however, if it's just a vanilla ECMAScript object, then the interop
compatibility checks will be used instead.

The manual already states that this is the case; unfortunately, it
lies---this was apparently overlooked, and is a bug.
2014-08-06 23:07:44 -04:00
Mike Gerwitz 23557e7d5c Interface/InteropTest case assertion refactoring
This will allow multiple sub-assertions to be performed---see next commit.
2014-08-06 22:46:03 -04:00
Mike Gerwitz 78bffd9ce1
tools/mkrelease added
This is the script that is used to automate most steps of the ease.js
release process.
2014-07-28 00:50:46 -04:00
Mike Gerwitz f53c180d65
`clean` target now cleans version file 2014-07-28 00:08:06 -04:00