1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
# RGen Framework
# (c) Martin Thiede, 2006
require 'rgen/metamodel_builder'
module RGen
module Util
class Base
extend MetamodelBuilder
def initialize(env=nil)
env << self if env
end
end
class AutoCreatedClass < Base
def method_missing(m,*args)
return super unless self.class.parent.accEnabled
if m.to_s =~ /(.*)=$/
self.class.has_one($1)
send(m,args[0])
elsif args.size == 0
self.class.has_many(m)
send(m)
end
end
end
# will be "extended" to the auto created class
module ParentAccess
def parent=(p)
@parent = p
end
def parent
@parent
end
end
module AutoClassCreator
attr_reader :accEnabled
def const_missing(className)
return super unless @accEnabled
module_eval("class "+className.to_s+" < RGen::AutoCreatedClass; end")
c = const_get(className)
c.extend(ParentAccess)
c.parent = self
c
end
def enableACC
@accEnabled = true
end
def disableACC
@accEnabled = false
end
end
end
end
|