class DataModel::Domain

Attributes

contents[R]
name[R]

Public Class Methods

code(*context, description: nil, title: nil, uri: nil) click to toggle source
# File src/data_model.rb, line 171
def code(*context,
         description: nil, title: nil, uri: nil)
  unless instance_variable_defined? :@codes
    @codes = {}
    self.define_singleton_method(:codes) {@codes}
  end
  id = "#{context.join '.'}"
  @codes[id] = {:id => id, :description => description, :title => title, :uri => uri}
end
datatype(name, extends: DataType, description: "", &block) click to toggle source
# File src/data_model.rb, line 139
def datatype(name, extends: DataType, description: "", &block)
  unless instance_variable_defined? :@types
    @types = {}
    self.define_singleton_method(:types) {@types}
  end
  extends = getType(extends)
  type = self.const_set name, Class.new(extends)
  @types[name] = type
  dom = self
  type.instance_exec do
    init name, dom, extends, description
  end
  type.instance_exec &block
  type
end
getType(typeref) click to toggle source
# File src/data_model.rb, line 155
def getType(typeref)
  if !typeref
    return nil
  end
  if typeref.class == Symbol
    if !types[typeref]
      raise "Can't find type #{typeref} in #{typeref}"
    end
    return types[typeref]
  elsif typeref.class == Class
    return typeref
  else
    raise "type refs must be symbol or DataType class"
  end
end
new(name, &block) click to toggle source
# File src/data_model.rb, line 185
def initialize name, &block
  @contents = {}
  @name = name
  self.class.const_set name, self

  self.class.types.values.each do |t|
    # add a definition / accessor for each type
    k = t.typename.downcase
    self.define_singleton_method(k.to_sym) do |*args, &block|
      if args.length == 0 && !block
        unless @contents[k]
          raise("reading unset type decl #{k} on #{self}")
        end
        return @contents[k]
      end
      decl = t.new(k)
      @contents[k] = [] unless @contents[k]
      @contents[k] << decl
      if block_given?
        decl.instance_exec &block
      else
        puts "warning: no block given for type #{k} in #{self}"
      end
      return decl
    end

  end

  self.instance_exec &block
end