message: adds move_from to polymorphic object
diff: @@ -186,6 +186,27 @@ public:
  return copied;
  }
  + /**
  + * Moves another object into this object.
  + *
  + * This is the polymorphic equivalent of the move assignment operator.
  + *
  + * @see move_from_impl(PolymorphicObject *)
  + *
  + * @param other the object to move from
  + *
  + * @return this
  + */
  + PolymorphicObject* move_from(PolymorphicObject* other)
  + {
  + this->template log<log::Logger::polymorphic_object_copy_started>(
  + exec_.get(), other, this);
  + auto moved = this->move_from_impl(other);
  + this->template log<log::Logger::polymorphic_object_copy_completed>(
  + exec_.get(), other, this);
  + return moved;
  + }
  +
  /**
  * Transforms the object into its default state.
  *
  @@ -260,6 +281,16 @@ protected:
  virtual PolymorphicObject* copy_from_impl(
  std::unique_ptr<PolymorphicObject> other) = 0;
  + /**
  + * Implementers of PolymorphicObject should implement this function instead
  + * of move_from(PolymorphicObject *).
  + *
  + * @param other the object to move from
  + *
  + * @return this
  + */
  + virtual PolymorphicObject* move_from_impl(PolymorphicObject* other) = 0;
  +
  /**
  * Implementers of PolymorphicObject should implement this function instead
  * of clear().
  @@ -332,6 +363,11 @@ public:
  this->copy_from_impl(std::move(other)));
  }
  + AbstractObject* move_from(PolymorphicObject* other)
  + {
  + return static_cast<AbstractObject*>(this->move_from_impl(other));
  + }
  +
  AbstractObject* clear()
  {
  return static_cast<AbstractObject*>(this->clear_impl());
  @@ -592,6 +628,12 @@ protected:
  return this;
  }
  + PolymorphicObject* move_from_impl(PolymorphicObject* other) override
  + {
  + as<ConvertibleTo<ConcreteObject>>(other)->move_to(self());
  + return this;
  + }
  +
  PolymorphicObject* clear_impl() override
  {
  *self() = ConcreteObject{this->get_executor()};
  