Skip to content

Instantly share code, notes, and snippets.

@wycleffsean
Created July 17, 2015 05:21
Show Gist options
  • Save wycleffsean/6ac8ff080e3833e5599f to your computer and use it in GitHub Desktop.
Save wycleffsean/6ac8ff080e3833e5599f to your computer and use it in GitHub Desktop.
Coffeescript Mixins
Mixin = require './mixin.coffee'
Module = require './module.coffee'
class Logger extends Mixin
yo = (msg) -> console.log msg
class_log: yo
@log: yo
class MyLogger extends Module
@extends Logger
class MyOtherLogger extends Module
@extends Logger
test = new MyLogger
test.log 'yo'
MyAlerter.class_log 'class yo'
x.class_alert 'neat-o' for x in Alerter::extensions
class Mixin
extensions: []
extended: (obj) -> @extensions.push obj
module.exports = Mixin
MIXIN_KEYWORDS = ['extended', 'extensions']
IGNORED_KEYS = ['constructor', '__super__'].concat MIXIN_KEYWORDS
class Module
# Private Methods
materialize = (obj) ->
if obj instanceof Function then new obj() else obj
extend = (target, obj) ->
for key, value of obj when key not in IGNORED_KEYS
target::[key] = value
for key, value of (obj::) when key not in IGNORED_KEYS
target[key] = value
# Class Methods
@extends: (obj) ->
extend @, obj
materialize(obj).extended?(@)
this
module.exports = Module
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment