# STATUS: Untested

KindUtils = module.exports =

	getKind: (type) ->
		return getType type.prototype

	setKind: (type, kind) ->
		setType type.prototype, kind
		return type

	testKind: (opts) ->
		validateTypes opts, _specs.testKind
		_testKind opts.type, opts.kind, opts.compare

	assertType = (value, type) ->
		throw TypeError "A value was a #{getType(value).name} when a #{type.name} was expected." unless testType value, type

	getKinds: (type) ->
		types = []
		loop
			types.push type
			type = KindUtils.getKind type
			break unless type?
		return types

	validateKind: (kind) ->
		return (opts, key, value) ->
			throw Error "property is not the required kind" unless _testKind getType(value), kind, compareTypes

#
# Internal
#

{ getType, setType, testType, validateTypes, compareTypes } = require "./TypeUtils"

_specs =
	testKind:
		type: KindUtils.validateKind Function
		kind: KindUtils.validateKind Function
		compare: (opts, key, value) -> 
			opts[key] = if testType(value, Function) then value else compareTypes

_testKind = (type, kind, compare) ->
	loop
		return true if compare type, kind
		break if type is Object
		type = KindUtils.getKind type
		break if type is null
	return false
