|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/addoverrides1.lua.html
-- http://anggtwu.net/LUA/addoverrides1.lua
-- (find-angg "LUA/addoverrides1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- Introduction
-- ============
-- A class BB is an "overclass" over a class CC when the methods in
-- BB.__index are intended to be used as overrides for some methods in
-- CC.__index. An object of this overclass BB is typically created by
-- running something like this:
--
-- o = addoverrides(CC.from(args), BB.__index)
--
-- See the test block for an example.
--
-- At this moment this is only used by:
-- (find-angg "ToTeX1.lus")
--
-- (defun ao () (interactive) (find-angg "LUA/addoverrides1.lua"))
-- «.addoverrides» (to "addoverrides")
-- «.addoverrides-tests» (to "addoverrides-tests")
-- Low-level logic:
-- From: A -----------------> mt1 --> C
-- to: A --> mt3 --> B2 --> mt2 --> C
-- where: mt2 = { __index = C }
-- B2 = shallowcopy(B)
-- B2.__mt = C
-- mt3 = shallowcopy(mt1)
-- mt3.__index = B2
-- A.__mt = mt3
--
-- «addoverrides» (to ".addoverrides")
addoverrides = function (A, B)
local mt1 = getmetatable(A)
local C = getmetatable(A).__index
local mt2 = { __index = C }
local B2 = setmetatable(shallowcopy(B), mt2)
local mt3 = shallowcopy(mt1); mt3.__index = B2
return setmetatable(A, mt3)
end
-- «addoverrides-tests» (to ".addoverrides-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "addoverrides1.lua"
CC = Class {
type = "CC",
from = function (str) return CC {str=str} end,
__index = {
foo = function (o) return "foo:"..o.str end,
},
}
BB = Class {
type = "BB",
from = function (str) return addoverrides(CC.from(str), BB.__index) end,
__index = {
bar = function (o) return "bar:"..o:foo() end,
},
}
a1 = CC.from("_a1_")
a2 = BB.from("_a2_")
= a1:foo() --> foo:_a1_
= a2:foo() --> foo:_a2_
= a1:bar() --> <error>
= a2:bar() --> bar:foo:_a2_
= otype(a1) --> CC
= otype(a2) --> CC
gm = function (o) return getmetatable(o) end
gmi = function (o) return getmetatable(o).__index end
PPV( gm (a2))
PPV( gmi(a2))
PPV(gm (gmi(a2)))
PPV(gmi(gmi(a2)))
require "Tos2"
PPC( gm (a2))
PPC( gmi(a2))
PPC(gm (gmi(a2)))
PPC(gmi(gmi(a2)))
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: