From ac39a3b330cbf7c4b65ba907783364b63fb109b3 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Thu, 12 Apr 2007 10:35:45 +0000 Subject: Module\#define_structure method: define a new Struct only if doesn't exist already or if the attribute list changed --- lib/rbot/core/utils/extends.rb | 24 ++++++++++++++++++++++++ lib/rbot/core/utils/utils.rb | 1 - 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'lib') 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 -- cgit v1.2.3