Skip to content

Instantly share code, notes, and snippets.

@d4rky-pl
Last active March 30, 2017 22:46
Show Gist options
  • Save d4rky-pl/3833ded78ea6678de912ed4666705866 to your computer and use it in GitHub Desktop.
Save d4rky-pl/3833ded78ea6678de912ed4666705866 to your computer and use it in GitHub Desktop.
import/export in Ruby
ModuleExporter.module(__FILE__) do
_Bar = Class.new do
def bar
"Bar!"
end
end
export _Bar
end
# alternative syntax:
# export Class.new do
# def bar
# "Bar!"
# end
# end
ModuleExporter.module __FILE__ do
# can't use Bar because it's automatically leaking to global namespace
_Bar = import 'bar'
_Foo = Class.new(_Bar) do
def foo
"Foo" + bar
end
end
export _Foo
end
class ModuleExporter
class Sandbox < BasicObject
def self.import(from)
::ModuleExporter.import(from)
end
def self.export(object, &block)
object.class_eval(&block) if block_given?
@__export__ = object
end
def self.__export__
@__export__
end
end
def self.setup(root:)
Thread.current['__exports_root__'] = root
Thread.current['__exports__'] = {}
end
def self.root
Thread.current['__exports_root__']
end
def self.module(file, &block)
Thread.current['__exports__'] ||= {}
raise 'Only one module block per file!' if Thread.current['__exports__'].has_key?(file)
Thread.current['__exports__'][file] = Class.new(ModuleExporter::Sandbox)
Thread.current['__exports__'][file].instance_eval(&block)
end
def self.import(source)
file = File.join(root, source) + ".rb"
require file unless Thread.current['__exports__'][file]
raise "Unknown import #{source}. Check your paths (looked in: #{file})" unless Thread.current['__exports__'][file]
export = Thread.current['__exports__'][file].__export__
raise "#{source} does not export any classes" unless export
export
end
end
require './module_exporter'
ModuleExporter.setup(root: File.expand_path(File.dirname(__FILE__)))
_MyLocalClass = ModuleExporter.import 'foo'
MyGlobalClass = ModuleExporter.import 'bar'
puts _MyLocalClass.new.foo # => FooBar!
puts MyGlobalClass.new.bar # => Bar!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment