function Storage (options) {
	// we're going to mutate options so get a clean copy of it
	options = assign({}, options);

	var AdapterType = options.adapter;
	delete options.adapter;

	if (typeof AdapterType !== 'function') {
		throw new Error('Invalid Storage Adapter\n'
			+ 'The storage adapter specified is not a function. Did you '
			+ 'require the right package?\n');
	}

	debug('Initialising Storage with adapter ' + AdapterType.name);

	// ensure the adapter compatibilityLevel of the adapter matches
	if (AdapterType.compatibilityLevel !== ADAPTER_COMPATIBILITY_LEVEL) {
		throw new Error('Incompatible Storage Adapter\n'
			+ 'The storage adapter specified (' + AdapterType.name + ') '
			+ 'does not match the compatibility level required for this '
			+ 'version of Keystone.\n');
	}

	// assign ensures the default schema constant isn't exposed as a property
	var schemaFields = assign({}, SCHEMA_FIELD_DEFAULTS, AdapterType.SCHEMA_FIELD_DEFAULTS, options.schema);
	delete options.schema;

	// Copy requested fields into local schema.
	var schema = this.schema = {};
	for (var path in schemaFields) {
		if (!schemaFields[path]) continue;

		var type = AdapterType.SCHEMA_TYPES[path] || SCHEMA_TYPES[path];
		if (!type) throw Error('Unknown type for requested schema field ' + path);
		schema[path] = type;
	}

	// ensure Storage schema features are supported by the Adapter
	if (schema.url && typeof AdapterType.prototype.getFileURL !== 'function') {
		throw Error('URL schema field is not supported by the ' + AdapterType.name + ' adapter');
	}

	// create the adapter
	this.adapter = new AdapterType(options, schema);
}
# Storage Prototype

	Creates a new Keystone Storage instance, and validates and initialises the
	specified adapter. Storage schema is configured from the adapter or default.