BasicModel::load() and BasicModel::save() cope with missing columns
BasicModel::find() also needs to avoid missing columns
Hook function for Model classes to register a callback that is executed
after a column is successfully added
New BasicModel functionality to normalize lane tables in conjunection
with server tables.
Safely Renaming a Column in custdata, pt 1

======================================
STEP ONE: Define a New Column
======================================
Edit CustdataModel.php and define a ChargeLimit column.
Re-run BasicModel on it to update accessors.

php BasicModel.php CustdataModel.php

Add a hook function Custdata::hookAddColumnChargeLimit
to copy the current values in custdata.MemDiscountLimit
to the new column. The view memChargeBalance also
needs to be rebuilt using the new column.

Edit install/sql/op/custdata.php so new installs will
have the column without needing an update. Ditto
for install/sql/trans/memChargeBalance.php.

Since the lane table needs to match, set
$normalize_lanes to true for CustdataModel. The hook
function needs a different definition for the lane-side
memchargebalance view. The install scripts should
also be updated on the lane side.

Now it's time to run the update. Manually creating a
backup of custdata would not be a bad idea.

php BasicModel.php --update <database name> CustdataModel.php

======================================
STEP TWO: Code Revisions
======================================
First pass goal is to use both columns. Any place
that updates custdata.MemDiscountLimit should
also update custdata.ChargeLimit. Places that
use the value of custdata.MemDiscountLimit should
use custdata.ChargeLimit instead.

None of this code should break if the new column
is not yet present. Models simplify some of that but
there are still some sections of defensive coding.