Angular.js CoffeeScript Controller Base Class - Devign に書いてあるとおり。
inject や initialize のとこをちょこっと変えて、こんな感じになった。
AuthedCtrl を継承していれば $scope にログインユーザが自動的にセットされる。本番は mixin 自にやりたいけどそれはまた今度で。
 class @BaseCtrl
  @register: (name) ->
    name ?= @name || @toString().match(/function\s*(.*?)\(/)?[1]
    angular.module('ngappApp').controller name, @
  @inject: (args...) ->
    @$inject ?= ['$scope']
    @$inject = @$inject.concat args
  constructor: (@scope, args...) ->
    for key, index in @constructor.$inject[1..]
      @[key] = args[index]
    for key, fn of @constructor.prototype
      continue unless typeof fn is 'function'
      continue if key in ['constructor', 'initialize'] or key[0] is '_'
      @scope[key] = fn.bind?(@) || _.bind(fn, @)
    @initialize()
  initialize: ->
class @AuthedCtrl extends BaseCtrl
  @inject 'AuthService'
  initialize: =>
    super()
    @AuthService.user (user) =>
      @currentUser = user
      @scope.currentUser = user
class VacationsCtrl extends AuthedCtrl
  @register()
  @inject 'Vacation'
  initialize: =>
    super()
    @scope.vacations = @Vacation.query()
    @scope.vacation = new @Vacation
  create: =>
    console.debug(@scope.vacation)
    @scope.vacation.$save (v) =>
      console.debug(v)
      @scope.vacations.push(v)
      @scope.vacation = new @Vacation
いまさらながら AngularJS をさわってみたけど、 C と VB で書いてたむかしながらサーバクライアントアプリみたいで、ちょっと楽しい。
あるいは継続を使った web フレームワークのサーバ処理がごっそりクライアントサイドに移った感じ。