to
// DEFINITION CALL - foreach ($this->definition->info[$token->name]->attr_transform as $transform) { + foreach ($this->definition->info[$token->name]->attr_transform + as $transform + ) { $attr = $transform->transform($attr); } + // create alias to this element's attribute definition array, see + // also $d_defs (global attribute definition array) + // DEFINITION CALL + $defs = $this->definition->info[$token->name]->attr; + + // iterate through all the attribute keypairs + // Watch out for name collisions: $key has previously been used foreach ($attr as $attr_key => $value) { // call the definition if ( isset($defs[$attr_key]) ) { + // there is a local definition defined if (!$defs[$attr_key]) { + // We've explicitly been told not to allow this element. + // This is usually when there's a global definition + // that must be overridden. + // Theoretically speaking, we could have a + // AttrDef_DenyAll, but this is faster! $result = false; } else { - $result = $defs[$attr_key]->validate($value, $config, $accumulator); + // validate according to the element's definition + $result = $defs[$attr_key]->validate( + $value, $config, $accumulator + ); } } elseif ( isset($d_defs[$attr_key]) ) { - $result = $d_defs[$attr_key]->validate($value, $config, $accumulator); + // there is a global definition defined, validate according + // to the global definition + $result = $d_defs[$attr_key]->validate( + $value, $config, $accumulator + ); } else { + // system never heard of the attribute? DELETE! $result = false; } // put the results into effect if ($result === false || $result === null) { + // remove the attribute unset($attr[$attr_key]); } elseif (is_string($result)) { // simple substitution $attr[$attr_key] = $result; } - // we'd also want slightly more complicated substitution, + + // we'd also want slightly more complicated substitution + // involving an array as the return value, // although we're not sure how colliding attributes would - // resolve + // resolve (certain ones would be completely overriden, + // others would prepend themselves). } // commit changes