v0.6.1 dev branch (#61)

* Always invoke deserialize in compose command

* More validation of composition object
diff --git a/bin/compose b/bin/compose
index b2b5246..8c297e8 100755
--- a/bin/compose
+++ b/bin/compose
@@ -47,8 +47,7 @@
     const filename = argv._[0]
     let composition
     try {
-        composition = require(path.resolve(filename))
-        if (filename.slice(filename.lastIndexOf('.')) === '.json') composition = util.deserialize(composition)
+        composition = util.deserialize(require(path.resolve(filename)))
         if (typeof argv.lower === 'string') composition = util.lower(composition, argv.lower || [])
     } catch (error) {
         console.error('Bad composition')
diff --git a/composer.js b/composer.js
index 2dcdca3..de97ca6 100644
--- a/composer.js
+++ b/composer.js
@@ -347,6 +347,12 @@
 
         // construct a composition object with the specified fields
         constructor(composition) {
+            if (!isObject(composition) || composer.util.combinators[composition.type] === undefined) throw new ComposerError('Invalid argument', composition)
+            const combinator = composer.util.combinators[composition.type]
+            if (combinator.components && composition.components === undefined)throw new ComposerError('Invalid argument', composition)
+            for (let arg of combinator.args || []) {
+                if (!arg.optional && composition[arg._] === undefined) throw new ComposerError('Invalid argument', composition)
+            }
             return Object.assign(this, composition)
         }
 
@@ -371,7 +377,7 @@
             const combinator = combinators[type]
             // do not overwrite existing combinators
             composer[type] = composer[type] || function () {
-                const composition = new Composition({ type })
+                const composition = { type }
                 const skip = combinator.args && combinator.args.length || 0
                 if (!combinator.components && (arguments.length > skip)) {
                     throw new ComposerError('Too many arguments')
@@ -398,7 +404,7 @@
                 if (combinator.components) {
                     composition.components = Array.prototype.slice.call(arguments, skip).map(obj => composer.task(obj))
                 }
-                return composition
+                return new Composition(composition)
             }
         }
     }