require 'tempfile'

class Progs
	attr_accessor :list

	def initialize
		@list = []
	end

	def include?(name)
		@list.each{|prog| return true if prog.name == name }
	end

	def <<(prog)
		@list << prog
	end

	def [](name)
		return find(name)
	end

	def find(name)
		@list.each{|prog| return prog if prog.name == name }
	end

	def run(trigger, doer, args = nil)
		@list.each{|prog|
			if prog.trigger == trigger
				if trigger == "roomenter"
					prog.exec(prog.method, doer, args) if prog.owner.location.rid == doer.location.rid
				end
			end
		}
	end
end

class Prog
	attr_accessor :config, :trigger, :carryover, :method, :name, :owner

	def initialize(cfname, owner)
		@config = CFile.new(cfname)
		@trigger = @config['@trigger']
		@method = @config['@method']
		@name = @method.delete("doprog_")
		f = Tempfile.new(@method)
		f.open
		@config['codeblock'].each{|line|
			f.print(line + "\n")
		}
		f.close
		load(f.path)
		@owner = owner
		f.close(true)
		return self
	end

	def exec(method, doer, args)
		@carryover = Progs.send(method, @owner, doer, args, @carryover)
	end
end
Logger.log("Prog code initialized.")