Max Williams <toastkid.williams / gmail.com> wrote: > Eg when i do a require, raise a warning if the gem wasn't loaded. Then, > when i restart the app, i see the warnings and can install the gems. Right, this is why RubyFrontier uses "myrequire" instead of "require": def myrequire(*what) # (1) no penalty for failure; we catch the LoadError and we don't re-raise # (2) arg can be an array, so multiple requires can be combined in one line # (3) array element itself can be a pair, in which case second must be array of desired includes as symbols # that way, we don't try to perform the includes unless the require succeeded # and we never *say* the include as a module, so it can't fail at compile time # and if an include fails, that does raise all the way since we don't catch NameError what.each do |thing| begin require((t = Array(thing))[0]) Array(t[1]).each {|inc| include self.class.const_get(inc) rescue puts "Warning: failed to include #{inc.to_s}"} rescue LoadError puts "Warning: Require failed", "This could cause trouble later... or not. Here's the error message we got:" puts $! end end end The idea here is that by using "myrequire" everywhere, I *notify* the user that a require failed, without actually encountering a fatal error. The fatal error would be encountered only the user tried to *use* some code that actually *calls* something inside one of the required files - and that might never happen. But at least this way the user gets a list, up front, of gems that need installing sooner or later. So I'm thinking you could use this, or something like it... m.