Scores are given from 2 (worst) to 9 (best), with 5 being neutral. 1 is (with a few exceptions) reserved for movies I couldn't bring myself to watch until the end. 10 is reserved for movies I fell in love with, things I like irrationally much.

1: couldn't endure it.
2: absolutely hate it.
3: quite bad.
4: bit of a let down.
5: doesn't matter if you watch this one or not.
6: worth a watch if you come across it.
7: I like it!
8: you have to see this.
9: you have to see this *right now*.
10: omgwtfbbq, one of my all time favourites.
this_.model.category.create({ name: categoryName, private: private_ }).complete(function(err, newCategory) {
   if (err) { return callback(err); }
   category = newCategory;
CategoryDal.prototype.getCreateCategoryByName = function(categoryName, private, user, callback) {
	var this_ = this;
	var private_ = private == "true";
	// var category = null;
	var created = false;
	this_.model.category.find(
		{
			where:
				{name: categoryName, private: private_}
		}
	).success(
		function(category) {
			if (!category) {
				winston.info("Category '" + categoryName + "' private '" + private_ + "' needs to be created!");
				this_.model.category.create({ name: categoryName, private: private_ }).complete(function(err, newCategory) {
					if (err) { return callback(err); }
					category = newCategory;
					created = true;
				});
			}
			user.getCategories({where: { id: category.id}}).complete(function(err, categories){
				// if (err) { return callback(err); }
				if (!categories){
					user.addCategory(category).complete(function(err, category) {
						if (err) { return callback(err); }
						return callback(null, category, created);
					});
				} else {
					callback(null, null, created);
				}
CategoryDal.prototype.getCreateCategoryByName = function(categoryName, private, user, callback) {
	var this_ = this;
	var private_ = private == "true";
	var category = null;
	var created = false;
	this_.model.category.find(
		{
			where:
				{name: categoryName, private: private_}
		}
	).success(
		function(category) {
			if (!category) {
				winston.info("Category '" + categoryName + "' private '" + private_ + "' needs to be created!");
				this_.model.category.create({ name: categoryName, private: private_ }).complete(function(err, newCategory) {
					if (err) { return callback(err); }
					this_.category = newCategory;
					this_.created = true;
					// callback(null, newCategory, true);
				});
			}
			user.getCategories({where: { id: category.id}}).complete(function(err, categories){
				// if (err) { return callback(err); }
				if (!categories){
					debugger;
					user.addCategory(category).complete(function(err, category) {
						debugger;
						if (err) { return callback(err); }
						return callback(null, category, created);
					});
UserDal.prototype.validateUser = function(firstName, callback) {

var user = this.model.user.build({ firstName: firstName});

== Current solution: ==
var err = user.validate();

if (err) { return callback(err); }
winston.log("User validation successful!");
callback(null, user);

== Would love to have solution: ==
var messages = user.validate().complete(function(err, user){
if (err) { return callback(err); }
winston.log("User validation successful!");
callback(null, user);
});

== Also tried: ==
var err = user.validate()
  .success(function(user) {
      callback(null, user);
   })
   .error(function(err){
      winston.error(err);
      callback(err);
   });
==================
}
var messages = user.validate().complete(function(err, user) {
   if (err) { return callback(err); }
   winston.info("User validation successful!");
   callback(null, user);
});

var messages = user.validate().complete(
   function(err, user) {
      if (err) { return callback(err); }
      winston.info("User validation successful!");
      callback(null, user);
});

var messages = user.validate().complete(
function(err, user) {
   if (err) { return callback(err); }
   winston.info("User validation successful!");
   callback(null, user);
});
controller super:
var   util = require("../util/"),
      _ = require("underscore");

function Controller() {
}

Controller.prototype.createErrorString = function createErrorString(err, errorString){
   var errorFields = _.keys(err);
   for (var i = 0; i < errorFields.length; i++) {
      var fieldError = "Field '" + errorFields[i] + "': " + util.strings.replaceAll(": " + errorFields[i], "", err[errorFields[i]].toString());
      errorString = errorString.concat(fieldError);
   }
   return errorString;
};

module.exports = Controller;
_______________________________________________________________

category sub:
var	Controller = require('./controller.js'),
		util = require("../util/"),
      winston = require("winston"),
      _ = require("underscore");

function Category(categoryDal, userDal) {
	this.categoryDal = categoryDal;
	this.userDal = userDal;
}
SUPER:
var   util = require("../util/"),
      _ = require("underscore");

function Controller() {
}

Controller.prototype.createErrorString = function createErrorString(err, errorString){
   var errorFields = _.keys(err);
   for (var i = 0; i < errorFields.length; i++) {
      var fieldError = "Field '" + errorFields[i] + "': " + util.strings.replaceAll(": " + errorFields[i], "", err[errorFields[i]].toString());
      errorString = errorString.concat(fieldError);
   }
   return errorString;
};

module.exports = Controller;

SUB:
var	Controller = require('./controller.js'),
		util = require("../util/"),
      winston = require("winston"),
      _ = require("underscore");

function User(userDal) {
	this.userDal = userDal;
}

User.prototype = Controller.prototype;
SUPER:
var   util = require("../util/"),
      _ = require("underscore");

function Controller() {
}

Controller.prototype.createErrorString = function createErrorString(err, errorString){
   var errorFields = _.keys(err);
   for (var i = 0; i < errorFields.length; i++) {
      var fieldError = "Field '" + errorFields[i] + "': " + util.strings.replaceAll(": " + errorFields[i], "", err[errorFields[i]].toString());
      errorString = errorString.concat(fieldError);
   }
   return errorString;
};

module.exports = Controller;

SUB:
var	Controller = require('./controller.js'),
		util = require("../util/"),
      winston = require("winston"),
      _ = require("underscore");

function User(userDal) {
	this.userDal = userDal;
}

User.prototype = Controller.prototype;
controller.js:

var   util = require("../util/"),
      winston = require("winston"),
      _ = require("underscore");

function Controller(dal) {
   this.dal = dal;
}

Controller.prototype.createErrorString = function createErrorString(err, errorString){
   var errorFields = _.keys(err);
   for (var i = 0; i < errorFields.length; i++) {
      var fieldError = "Field '" + errorFields[i] + "': " + util.strings.replaceAll(": " + errorFields[i], "", err[errorFields[i]].toString());
      errorString = errorString.concat(fieldError);
   }
   return errorString;
};



usercontroller:

var	Controller = require('./controller.js');

function User(userDal) {
	this.userDal = userDal;
}

User.prototype = Controller.prototype;