diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-04-12 10:35:45 +0000 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2007-04-12 10:35:45 +0000 |
commit | ac39a3b330cbf7c4b65ba907783364b63fb109b3 (patch) | |
tree | e773d062644ecad55fcd0d48e505a882b0f94a82 /lib/rbot | |
parent | bf03d9f2b695772212abee81d405483c5c374633 (diff) |
Module\#define_structure method: define a new Struct only if doesn't exist already or if the attribute list changed
Diffstat (limited to 'lib/rbot')
-rw-r--r-- | lib/rbot/core/utils/extends.rb | 24 | ||||
-rw-r--r-- | lib/rbot/core/utils/utils.rb | 1 |
2 files changed, 24 insertions, 1 deletions
diff --git a/lib/rbot/core/utils/extends.rb b/lib/rbot/core/utils/extends.rb index bcea735b..1aa6d457 100644 --- a/lib/rbot/core/utils/extends.rb +++ b/lib/rbot/core/utils/extends.rb @@ -13,6 +13,30 @@ # Please note that global symbols have to be prefixed by :: because this plugin # will be read into an anonymous module +# Extensions to the Module class +# +class ::Module + + # Many plugins define Struct objects to hold their data. On rescans, lots of + # warnings are echoed because of the redefinitions. Using this method solves + # the problem, by checking if the Struct already exists, and if it has the + # same attributes + # + def define_structure(name, *members) + sym = name.to_sym + if Struct.const_defined?(sym) + kl = Struct.const_get(sym) + if kl.new.members.map { |member| member.intern } == members.map + debug "Struct #{sym} previously defined, skipping" + const_set(sym, kl) + return + end + end + debug "Defining struct #{sym} with members #{members.inspect}" + const_set(sym, Struct.new(name.to_s, *members)) + end +end + # Extensions to the Array class # diff --git a/lib/rbot/core/utils/utils.rb b/lib/rbot/core/utils/utils.rb index 71b4c8d4..23d50c31 100644 --- a/lib/rbot/core/utils/utils.rb +++ b/lib/rbot/core/utils/utils.rb @@ -546,7 +546,6 @@ module ::Irc return retval end - end end |