local Prop = {}
Prop.__index = Prop

function Prop:getState(element)
  return element[self:getId()]
end

function Prop:setState(element, state)
  element[self:getId()] = state
end

function Prop:getId()
  return self.uid
end

function Prop.attach(elementType, prop, defaultState)
  prop:setState(elementType, defaultState or prop.defaultState)
  return prop:with(elementType)
end

function Prop:new(o)
  if o.uid == nil then
    error("Property must carry a unique identifier")
  end
  setmetatable(o, Prop)
  o.__index = o
  return o
end

return Prop