Last active
March 30, 2017 22:46
-
-
Save d4rky-pl/3833ded78ea6678de912ed4666705866 to your computer and use it in GitHub Desktop.
import/export in Ruby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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