<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: metatables code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 04 Sep 2008 22:04:51 GMT</pubDate>
    <description>DZone Snippets: metatables code</description>
    <item>
      <title>Lua: Sane Granular Defaults for User Supplied Data</title>
      <link>http://snippets.dzone.com/posts/show/941</link>
      <description>This code is an example of how to implement sane defaults for user supplied data in a generically useful fashion.  It was written for use in World of Warcraft User Interface addons, though it would be useful elsewhere.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;local mooDB&lt;br /&gt;&lt;br /&gt;local defaults = {&lt;br /&gt;    a = {&lt;br /&gt;        foo = "bar"&lt;br /&gt;    },&lt;br /&gt;    b = 1,&lt;br /&gt;    c = {&lt;br /&gt;        bar = "foo"&lt;br /&gt;    },&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if not mooDB then&lt;br /&gt;    -- NOTE: This would not be in the actual real world code.  This&lt;br /&gt;    -- simulates user data, normally loaded from some sort&lt;br /&gt;    -- of datastore, which is SavedVariables in the case of&lt;br /&gt;    -- World of Warcraft.&lt;br /&gt;    mooDB = {&lt;br /&gt;        c = {&lt;br /&gt;            bop = "whee"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;function inheritdefaults(t, defaults)&lt;br /&gt;    for k,v in pairs(defaults) do&lt;br /&gt;        if t[k] then&lt;br /&gt;            if type(v) == "table" then&lt;br /&gt;                inheritdefaults(t[k], v)&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    local mt = getmetatable(t) or {}&lt;br /&gt;    function mt:__index(k)&lt;br /&gt;        return defaults[k]&lt;br /&gt;    end&lt;br /&gt;    return setmetatable(t, mt)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;inheritdefaults(mooDB, defaults)&lt;br /&gt;&lt;br /&gt;assert(mooDB ~= defaults)&lt;br /&gt;assert(mooDB.a == defaults.a)&lt;br /&gt;assert(mooDB.c ~= defaults.c)&lt;br /&gt;assert(mooDB.a.foo == "bar")&lt;br /&gt;assert(mooDB.b == 1)&lt;br /&gt;assert(mooDB.c.bar == "foo")&lt;br /&gt;assert(mooDB.c.bop == "whee")&lt;/code&gt;</description>
      <pubDate>Mon, 05 Dec 2005 16:05:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/941</guid>
      <author>kergoth (Chris Larson)</author>
    </item>
  </channel>
</rss>
