Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

`class B extends A` calls `A.extended(B)` when `A.extended` is a function #516

Closed
sstephenson opened this Issue Jul 17, 2010 · 7 comments

Comments

Projects
None yet
6 participants
Contributor

sstephenson commented Jul 17, 2010

It'd be useful if CoffeeScript could invoke a callback on a class after it's subclassed with the extends keyword.

With such a callback, you could implement a base class that propagates its class methods to subclasses:

class Base
  @extended: (subclass) ->
    for key, value of @
      subclass[key]: value

class Element extends Base
  @fromHTML: (html) ->
    node: # ...
    new @(node)

class MyElement extends Element
  # ...

MyElement.fromHTML("<div>...</div>")

You could also implement a test case class that collects its subclasses and runs them automatically:

class TestCase
  @subclasses: []
  @extended: (subclass) ->
    subclass.extended: TestCase.extended
    TestCase.subclasses.push subclass

class BaseTest extends TestCase
  # ...

class ElementTest extends TestCase
  # ...

for testCase in TestCase.subclasses
  TestRunner.run testCase
Owner

jashkenas commented Jul 17, 2010

Mind pasting an example of the JavaScript you'd like to generate for this? Something along these lines?

if (Base.extended) Base.extended(Element);

Or do you think there needs to be a check to ensure that it's a function?

Collaborator

michaelficarra commented Jul 18, 2010

For what it's worth, I am strongly in favor of this callback. It would be similar to Ruby's Class::inherited method (http://ruby-doc.org/core/classes/Class.html#M002785), and provide a very useful metaprogramming capability that is not otherwise possible to implement.

Collaborator

TrevorBurnham commented Jul 18, 2010

+1 to this. In general, I'd like to see CoffeeScript classes become more powerful constructs. And the test case example is awesome.

Contributor

sstephenson commented Jul 18, 2010

Here's my proposal. We'd only call extended if it's a function. And we'd move the __superClass__ assignment after the call to extended, so class method propagation can be implemented without having to skip over the __superClass__ property.

Owner

jashkenas commented Jul 18, 2010

sstephenson's patch is now merged to master. Closing the ticket.

very cool!

@ghost

ghost commented Oct 10, 2011

I've just been pointed to this ticket from: jashkenas#1762 ...what do you guy's think this?

This issue was closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment