URIS
http://raa.ruby-lang.org/project/dynaload/
http://www.codeforpeople.com/lib/ruby/dynaload/
NAME
dynaload.rb
DESCRIPTION
a simple toolset to make dynamic loading of classes and modules easier
imagine you have many files containing the following kinds of class
definitions
class ClassName
def method
end
end
you'd like to be able to dynamically load the file defining a class,
instantiate the class(es) defined in it, and and run ClassName#method on an
instance WITHOUT knowing beforhand which class will be loaded. dyanload
solves this problem. classes wishing to be dyanloaded do the following
···
----------------
file: 1.rb
----------------
require 'dynaload'
class ClassOne
def answer
42
end
end
Dynaload::export ClassOne, 'answer' => true
----------------
file: 2.rb
----------------
require 'dynaload'
class ClassTwo
def answer
42
end
end
Dynaload::export ClassTwo, 'answer' => true
the options hash ('answer' => true) may contain anything deemed useful and is
entirely dedicated for user data
now both files can be dynaloaded, the classes instantiated, and methods called
with
require 'dynaload'
%w( 1.rb 2.rb ).each do |file|
loaded = Dynaload::dynaload file
klasses = loaded.select{|klass, attributes| attributes['answer'] == true}
klasses.each do |klass, attributes|
object = klass::new
p object.answer
end
end
any class or module defined in a file can be exported and is then available
via the Dynaload interface. for instance:
class C
module M
class B
Dynaload::export B
end
end
end
Dynaload::export C
is valid and exports only the classes C and B - not C::M.
the concept works best with modules as the exported quantities and loading
within an anonymous wrapper module (the default) to protect the namespace.
eg.
----------------
file: 1.rb
----------------
require 'dynaload'
module FooJob
def run
...
end
end
Dynaload::export FooJob
----------------
file: 2.rb
----------------
require 'dynaload'
module BarJob
def run
...
end
end
Dynaload::export BarJob
loading is done (by default) in an anonymous module so neither FooJob or
BarJob is introduced into the caller's namespace:
require 'dynaload'
loaded = Dynaload::dynaload('1.rb') | Dynaload::dynaload('2.rb')
modules = loaded.modules
# here neither FooJob or BarJob are polluting namespace
SAMPLES/DOCS
see samples/*
CAVEATS
this software is experimental and quite simple
enjoy.
-a
--
ara [dot] t [dot] howard [at] noaa [dot] gov
all happiness comes from the desire for others to be happy. all misery
comes from the desire for oneself to be happy.
-- bodhicaryavatara
===============================================================================