Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Array
- def only
- length == 1 ? first : self
- end
- end
- class ProcClass
- def initialize(&block)
- @block = block
- end
- def to_class
- ClassBuilder.new(&@block)
- end
- private
- class ClassBuilder
- def initialize(&block)
- @block = block
- end
- def new(*args, &block)
- instance = InstanceBuilder.new
- static = StaticBuilder.new(self)
- @block.call(instance, static)
- if instance.respond_to?(:Init)
- instance.Init(*args, &block)
- end
- instance
- end
- def inspect
- "ProcClass"
- end
- alias inspect to_s
- def class
- Class
- end
- end
- class InstanceBuilder
- def initialize
- @hash = {}
- end
- def __key?(key)
- @hash.key?(key.to_s)
- end
- alias respond_to? __key?
- def __hash
- @hash
- end
- alias method_table __hash
- def method_missing(name, *values, &block)
- name = name.to_s
- if name.end_with?('=')
- @hash[name.tr('=', '')] = values.only
- else
- result = @hash[name]
- return unless result
- if result.is_a?(Proc)
- result.call(*values, &block)
- else
- result
- end
- end
- end
- end
- class StaticBuilder < BasicObject
- def initialize(class_builder)
- @class_builder = class_builder
- end
- def method_missing(name, procc)
- name = name.to_s.tr('=', '')
- @class_builder.define_singleton_method(name, &procc)
- end
- end
- end
- def klass!(&block)
- ProcClass.new(&block).to_class
- end
- MyClass = klass! { |this, static|
- static.X = proc {
- 1
- }
- this.Init = proc { |name|
- this.Set_Name(name)
- }
- this.Set_Name = proc { |name|
- this.name = name
- }
- }
- p MyClass.new('Dakota').name
- p MyClass.X
Advertisement
Add Comment
Please, Sign In to add comment