def star(self):
		'''
			If the present FSM accepts X, returns an FSM accepting X* (i.e. 0 or
			more Xes). This is NOT as simple as naively connecting the final states
			back to the initial state: see (b*ab)* for example.
		'''
		alphabet = self.alphabet

		initial = {self.initial}

		def follow(state, symbol):
			next = set()
			for substate in state:
				if substate in self.map and symbol in self.map[substate]:
					next.add(self.map[substate][symbol])

				# If one of our substates is final, then we can also consider
				# transitions from the initial state of the original FSM.
				if substate in self.finals \
				and self.initial in self.map \
				and symbol in self.map[self.initial]:
					next.add(self.map[self.initial][symbol])

			if len(next) == 0:
				raise OblivionError

			return frozenset(next)

		def final(state):
			return any(substate in self.finals for substate in state)

		return crawl(alphabet, initial, final, follow) | epsilon(alphabet)
If the present FSM accepts X, returns an FSM accepting X* (i.e. 0 or
			more Xes). This is NOT as simple as naively connecting the final states
			back to the initial state: see (b*ab)* for example.