[](qualname)
click to toggle source
def [](qualname)
return qualname unless qualname.is_a? ::String
Token.cache[qualname]
end
cache()
click to toggle source
def cache
@cache ||= {}
end
each_token(&b)
click to toggle source
def each_token(&b)
Token.cache.each do |(_, t)|
b.call(t)
end
end
inspect()
click to toggle source
def inspect
"<Token #{qualname}>"
end
make_token(name, shortname, &b)
click to toggle source
def make_token(name, shortname, &b)
parent = self
Class.new(parent) do
@parent = parent
@name = name
@shortname = shortname
register!
class_eval(&b) if b
end
end
matches?(other)
click to toggle source
def matches?(other)
other.token_chain.include? self
end
qualname()
click to toggle source
def qualname
@qualname ||= token_chain.map(&:name).join('.')
end
register!()
click to toggle source
def register!
Token.cache[self.qualname] = self
parent.sub_tokens[self.name] = self
end
sub_tokens()
click to toggle source
def sub_tokens
@sub_tokens ||= {}
end
token(name, shortname, &b)
click to toggle source
def token(name, shortname, &b)
tok = make_token(name, shortname, &b)
const_set(name, tok)
end
token_chain()
click to toggle source
def token_chain
@token_chain ||= ancestors.take_while { |x| x != Token }.reverse
end