Skip to content

Instantly share code, notes, and snippets.

@dearshrewdwit
Created November 20, 2019 09:22
Show Gist options
  • Save dearshrewdwit/8ce0da6f1b1a52fb700f66263240047e to your computer and use it in GitHub Desktop.
Save dearshrewdwit/8ce0da6f1b1a52fb700f66263240047e to your computer and use it in GitHub Desktop.
Re-implementing class in ruby
module BasicClass
def self.new(parent_klass = nil, &block)
klass = lambda do
class_scope = {
ancestry: [klass, self],
instance_methods: {},
methods: {
define: lambda { |name, &block| class_scope[:instance_methods][name] = block },
new: lambda do |*args|
instance = lambda do
instance_scope = {
class_methods: class_scope[:methods].dup,
methods: class_scope[:instance_methods].dup,
instance_vars: {}
}
instance_scope[:methods][:initialize].call(instance_scope, *args)
binding
end
instance_scope = instance.call.local_variable_get('instance_scope')
instance
end
},
}
class_scope
end
class_scope = klass.call
block.call(class_scope)
klass
end
end
DockingStation = BasicClass.new do |class_scope|
class_scope[:methods][:define].call(:initialize) do |instance_scope, capacity=20|
instance_scope[:instance_vars]['@capacity'] = capacity
instance_scope[:instance_vars]['@bikes'] = []
end
class_scope[:methods][:define].call(:bikes) do |instance_scope|
instance_scope[:instance_vars]['@bikes']
end
class_scope[:methods][:define].call(:dock) do |instance_scope, bike|
instance_scope[:instance_vars]['@bikes'] << bike
end
class_scope[:methods][:define].call(:release_bike) do |instance_scope|
instance_scope[:instance_vars]['@bikes'].pop
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment