Skip to content

Instantly share code, notes, and snippets.

@delonnewman
Created May 3, 2019 05:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save delonnewman/7d7ba833eb8b9091503d289268ab508d to your computer and use it in GitHub Desktop.
Save delonnewman/7d7ba833eb8b9091503d289268ab508d to your computer and use it in GitHub Desktop.
class Var
attr_reader :meta, :namespace, :name
def self.intern(namespace, name, init = nil)
@@vars ||= {}
@@vars[name] = begin
v = Var.new(nil, namespace, name)
v.set(init) if init
v
end
end
def self.lookup(name)
@@vars[name]
end
def initialize(meta, namesapce, name)
@meta ||= {}
@namespace = namespace
@name = name
end
def dynamic?
@meta[:dynamic]
end
def set_dynamic
@meta[:dynamic] = true
end
# TODO: add watchers and validation
def set(value)
if dynamic? or @value.nil?
@value = value
else
raise "Can't set a Var once it's been set"
end
end
def get
@value
end
end
def define(definition)
name = definition.keys.first
init = definition.values.first
Var.intern(self.class.to_s.to_sym, name, init)
define_singleton_method name do
v = Var.lookup(name)
p v
v.get
end
define_singleton_method :"#{name}=" do |value|
Var.lookup(name).set(value)
end
end
define x: 1
p x
x = 4
p x
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment