Red []
info: func ['fn  /name /intro /args /refinements /locals /return /spec 
	/arg-num /arg-names /arg-types /ref-names /ref-types /ref-num /type
	/local intr ars refs locs ret arg ref typ
][
	intr: copy "" ars: make map! copy [] refs: make map! copy [] locs: copy [] ret: copy [] typ: ref-arg: ref-arg-type: none
	if lit-word? fn [fn: to-word fn]
	unless find [op! native! function! action!] type?/word get fn [
		cause-error 'user 'message ["Only function types accepted!"]
	]
	out: make map! copy []
	specs: spec-of get fn 
	parse specs [
		opt [set intr string!]
		any [set arg [word! | lit-word!] opt [set typ block!] opt string! (put ars arg either typ [typ][[any-type!]])]
		any [set ref refinement! [
			if (ref <> /local) (put refs to-lit-word ref make map! copy []) 
				opt string! 
				any [set ref-arg word! opt [set ref-arg-type block!] 
					(put refs/(to-word ref) to-lit-word ref-arg either ref-arg-type [ref-arg-type][[any-type!]])
				]
			|	any [set loc word! (append locs loc) opt string!] 
				opt [set-word! set ret block!]
		]]
		
		(
		out: case [
			name		[to-word fn]
			intro 		[intr] 
			args		[ars]
			arg-num		[length? ars]
			arg-names 	[copy keys-of ars] 
			arg-types	[copy values-of ars]
			refinements [refs] 
			ref-names	[copy keys-of refs]
			ref-types	[copy values-of refs]
			ref-num		[length? refs]
			locals 		[locs] 
			return 		[ret]
			spec		[specs]
			true 		[
				make object!  [
					name: 		to-word fn 
					intro: 		intr 
					args: 		ars 
					refinements: refs 
					locals: 	locs 
					return: 	ret 
					spec: 		specs 
					type: 		type? get fn
					arg-num: 	length? args
					arg-names: 	copy keys-of args
					arg-types: 	copy values-of args
					ref-names: 	copy keys-of refinements
					ref-types: 	copy values-of refinements
					ref-num:	length? refinements
				]
			]
		])
	]
	out
]
