Skip to content
New issue

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

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

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
Closed

Comments

@sstephenson
Copy link
Contributor

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
@jashkenas
Copy link
Owner

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?

@michaelficarra
Copy link
Collaborator

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.

@TrevorBurnham
Copy link
Collaborator

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

@sstephenson
Copy link
Contributor Author

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.

@jashkenas
Copy link
Owner

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

@devongovett
Copy link

very cool!

@ghost
Copy link

ghost commented Oct 10, 2011

I've just been pointed to this ticket from: #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
Projects
None yet
Development

No branches or pull requests

5 participants