Sean O'Halpin
11/5/2007 7:49:00 AM
On 11/5/07, Miss Elaine Eos <Misc@your-pants.playnaked.com> wrote:
> I'm trying to read-in a folder full of "plug-ins" and call each of them,
> in turn. Once I get the class-name, I do something like:
>
> require "#{PLUG_IN_DIR}/#{one_plugin}"
> plugin_class=Object.const_get(plugin_class_name).new
> plugin_class.some_method
>
> I *thought* that require worked a bit like the C pre-processor
> "include", in that it would read and execute the named file at that
> point, thereby defining my class and its methods. However, when I get
> to the middle line, I get
>
> uninitialized constant PluginClassName
>
> Since rails is mistaking my class-name for a constant, I'm guessing that
> require didn't execute the way I think it does, so my class-name isn't
> initialized.
>
> ...Or maybe I've completely mis-diagnosed the problem.
>
> At any rate, can someone offer a suggestion for how to read a folder
> full of class-definition-files and, once at a time,
>
> * Execute the class definition, so that my app knows about it
> * Instantiate an instance of the class (I think we have this part,
> above)
> * Call a method on that class (should just be able to say
> "a_class.a_method", right?)
>
> Thanks!
>
> --
> Please take off your pants or I won't read your e-mail.
> I will not, no matter how "good" the deal, patronise any business which sends
> unsolicited commercial e-mail or that advertises in discussion newsgroups.
>
>
Hi,
What you're doing here is right in principle. For example, in this code:
# ./myplugin.rb
class MyPlugin
def some_method
puts "Hi from #{self}!"
end
end
module Plugins
class AnotherPlugin
def some_method
puts "Hi from #{self}!"
end
end
end
__END__
# test-require-plugin.rb
one_plugin = "myplugin"
PLUG_IN_DIR = '.'
plugin_class_name = "MyPlugin"
require "#{PLUG_IN_DIR}/#{one_plugin}"
plugin_class = Object.const_get(plugin_class_name).new
plugin_class.some_method
plugin_class_name = "AnotherPlugin"
plugin_class = Plugins.const_get(plugin_class_name).new
plugin_class.some_method
# this will fail
plugin_class = Object.const_get(plugin_class_name).new
plugin_class.some_method
__END__
# output
Hi from #<MyPlugin:0xb7c25594>!
Hi from #<Plugins::AnotherPlugin:0xb7c23dfc>!
test-require-plugin.rb:14:in `const_get': uninitialized constant
AnotherPlugin (NameError)
from test-require-plugin.rb:14
only the last call to some_method fails. Have you checked that the
name of the class is correct or if you are defining your plugin class
within a module?
Regards,
Sean