tipsypastels

Untitled

Jan 7th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. class Array
  2. def only
  3. length == 1 ? first : self
  4. end
  5. end
  6.  
  7. class ProcClass
  8. def initialize(&block)
  9. @block = block
  10. end
  11.  
  12. def to_class
  13. ClassBuilder.new(&@block)
  14. end
  15.  
  16. private
  17.  
  18. class ClassBuilder
  19. def initialize(&block)
  20. @block = block
  21. end
  22.  
  23. def new(*args, &block)
  24. instance = InstanceBuilder.new
  25. static = StaticBuilder.new(self)
  26.  
  27. @block.call(instance, static)
  28.  
  29. if instance.respond_to?(:Init)
  30. instance.Init(*args, &block)
  31. end
  32.  
  33. instance
  34. end
  35.  
  36. def inspect
  37. "ProcClass"
  38. end
  39. alias inspect to_s
  40.  
  41. def class
  42. Class
  43. end
  44. end
  45.  
  46. class InstanceBuilder
  47. def initialize
  48. @hash = {}
  49. end
  50.  
  51. def __key?(key)
  52. @hash.key?(key.to_s)
  53. end
  54. alias respond_to? __key?
  55.  
  56. def __hash
  57. @hash
  58. end
  59. alias method_table __hash
  60.  
  61. def method_missing(name, *values, &block)
  62. name = name.to_s
  63.  
  64. if name.end_with?('=')
  65. @hash[name.tr('=', '')] = values.only
  66. else
  67. result = @hash[name]
  68. return unless result
  69.  
  70. if result.is_a?(Proc)
  71. result.call(*values, &block)
  72. else
  73. result
  74. end
  75. end
  76. end
  77. end
  78.  
  79. class StaticBuilder < BasicObject
  80. def initialize(class_builder)
  81. @class_builder = class_builder
  82. end
  83.  
  84. def method_missing(name, procc)
  85. name = name.to_s.tr('=', '')
  86. @class_builder.define_singleton_method(name, &procc)
  87. end
  88. end
  89. end
  90.  
  91. def klass!(&block)
  92. ProcClass.new(&block).to_class
  93. end
  94.  
  95. MyClass = klass! { |this, static|
  96. static.X = proc {
  97. 1
  98. }
  99.  
  100. this.Init = proc { |name|
  101. this.Set_Name(name)
  102. }
  103.  
  104. this.Set_Name = proc { |name|
  105. this.name = name
  106. }
  107. }
  108.  
  109. p MyClass.new('Dakota').name
  110. p MyClass.X
Advertisement
Add Comment
Please, Sign In to add comment