public function test_before_save_returned_false_halts_execution() { VenueCB::$before_update = array('before_update_halt_execution'); ActiveRecord\Table::clear_cache('VenueCB'); $table = ActiveRecord\Table::load('VenueCB'); $i_ran = false; $i_should_have_ran = false; $table->callback->register('before_save', function ($model) use(&$i_should_have_ran) { $i_should_have_ran = true; }); $table->callback->register('before_update', function ($model) use(&$i_ran) { $i_ran = true; }); $table->callback->register('after_save', function ($model) use(&$i_ran) { $i_ran = true; }); $v = VenueCB::find(1); $v->name .= 'test'; $ret = $v->save(); $this->assert_true($i_should_have_ran); $this->assert_false($i_ran); $this->assert_false($ret); $this->assert_true(strpos(ActiveRecord\Table::load('VenueCB')->last_sql, 'UPDATE') === false); }