[ANN] dynaload-0.2.0

A

Ara.T.Howard

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
===============================================================================
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top