Hi Chris,
I was using coffee script classes extensively but now I am inclined to use straight functions as controllers, writing direct to $scope instead of this (@) and use closure to keep everything together. This gets rid of all those unsightly @ blemishes everywhere and also removes the need to use => binding on methods that will be called by angular. It also provide the ability to hide implementation, which is more clunky with coffeescript classes. An example:
# Angular will inject $scope and $location for us
module.controller 'MyController', [ '$scope', '$location', ($scope, $location)->
somePrivateField = 'This is available throughout the controller but hidden from outside'
$scope.fieldToUseInView = 'This field will be publicly visible in the scope'
somePrivateMethod = (param1)->
# do something with param1
$scope.someHelperMethod = ()->
# do something for the view, maybe use private methods and fields
$scope.newField = somePrivateMethod(somePrivateField)
]
Personally, I find this syntax quite terse and agreeable.
If you want to inherit some functionality then you can call the super "class/function" in this function:
# Define super
MyBaseController = ($scope, $location)->
# Do stuff with $scope, etc
module.controller 'MyController', [ '$scope', '$location', ($scope, $location)->
# Call the base from here
MyBaseController($scope, $location)
Because you are not relying on $scope for all you public stuff rather than this/@ then you don't have to worry about prototype chains.
I have also found that in many cases, where you feel you need a base controller, you can/should use a service instead or rely on the scope inheritance mechanism provided by angular.
My 2 pennies worth.