local V={}V.__index=V function V.new()local F=setmetatable({},V)return F end function V.Enumerator(V)error("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \069\110\117\109\101\114\097\116\111\114 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \069\110\117\109\101\114\097\098\108\101\046")end return V
--- Allows an object to iterate over its elements in a generic for loop.
-- Provides an enumerator that can be used in a generic for loop similar to
-- pairs or ipairs.
--
-- @classmod Enumerable

local Enumerable = {}

Enumerable.__index = Enumerable

--- Creates a new Enumerable interface instance.
-- This should only be used when implementing a new Enumerable.
--
-- @return the new Enumerable interface
-- @static
-- @access private
function Enumerable.new()
	local self = setmetatable({}, Enumerable)
	return self
end

--- Creates an enumerator for the object.
-- The enumerator can be used directly in a generic for loop similar to pairs
-- or ipairs.
--
-- @return the enumerator generator
-- @return the invariant state
-- @return the control variable state
function Enumerable:Enumerator()
	error("Abstract method Enumerator must be overridden in first concrete subclass. Called directly from Enumerable.")
end

return Enumerable
