Created
May 3, 2019 05:41
-
-
Save delonnewman/7d7ba833eb8b9091503d289268ab508d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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