/**
  * Marks that we think this migration class can continue to migrate
  */
 public function reattempt()
 {
     parent::reattempt();
     //also, we want to reattempt any stages that were marked as borked
     foreach ($this->stages() as $stage) {
         if ($stage->is_broken()) {
             $stage->reattempt();
         }
     }
 }
 /**
  * A lot like "__sleep()" magic method in purpose, this is meant for persisting this class'
  * properties to the DB. However, we don't want to use __sleep() because its quite
  * possible that this class is defined when it goes to sleep, but NOT available when it
  * awakes (eg, this class is part of an addon that is deactivated at some point).
  */
 public function properties_as_array()
 {
     $properties = parent::properties_as_array();
     $properties['_migration_stages'] = array();
     foreach ($this->_migration_stages as $migration_stage_priority => $migration_stage_class) {
         $properties['_migration_stages'][$migration_stage_priority] = $migration_stage_class->properties_as_array();
     }
     unset($properties['_mappings']);
     foreach ($this->_mappings as $old_table_name => $mapping_to_new_table) {
         foreach ($mapping_to_new_table as $new_table_name => $mapping) {
             $success = $this->_set_mapping_option($old_table_name, $new_table_name, $mapping);
         }
     }
     return $properties;
 }