#pragma once #include #include #include "Item.h" class ItemModifier : public virtual Framework::ReferenceCounter { public: ItemModifier(); virtual void applyOn(Item* zItem) = 0; }; class ConsumeItemModifier : public ItemModifier { public: ConsumeItemModifier(); void applyOn(Item* zItem) override; }; class ConsumeItemModifierFactory : public SubTypeFactory { public: ConsumeItemModifierFactory(); ConsumeItemModifier* createValue( Framework::JSON::JSONObject* zJson) const override; void fromJson(ConsumeItemModifier* zResult, Framework::JSON::JSONObject* zJson) const override; void toJson(ConsumeItemModifier* zObject, Framework::JSON::JSONObject* zResult) const override; JSONObjectValidationBuilder* addToValidator( JSONObjectValidationBuilder* builder) const override; Framework::Text getTypeToken() const override; }; class DoNothingModifier : public ItemModifier { public: DoNothingModifier(); void applyOn(Item* zItem) override; }; class DoNothingModifierFactory : public SubTypeFactory { public: DoNothingModifierFactory(); DoNothingModifier* createValue( Framework::JSON::JSONObject* zJson) const override; void fromJson(DoNothingModifier* zResult, Framework::JSON::JSONObject* zJson) const override; void toJson(DoNothingModifier* zObject, Framework::JSON::JSONObject* zResult) const override; JSONObjectValidationBuilder* addToValidator( JSONObjectValidationBuilder* builder) const override; Framework::Text getTypeToken() const override; }; class AttributeItemModifier : public ItemModifier { private: Framework::RCArray attributes; Framework::RCArray values; public: AttributeItemModifier(); void applyOn(Item* zItem) override; void addAttribute(Framework::Text name, Framework::JSON::JSONValue* value); const Framework::RCArray& getAttributes() const; const Framework::RCArray& getValues() const; }; class AttributeItemModifierFactory : public SubTypeFactory { public: AttributeItemModifierFactory(); AttributeItemModifier* createValue( Framework::JSON::JSONObject* zJson) const override; void fromJson(AttributeItemModifier* zResult, Framework::JSON::JSONObject* zJson) const override; void toJson(AttributeItemModifier* zObject, Framework::JSON::JSONObject* zResult) const override; JSONObjectValidationBuilder* addToValidator( JSONObjectValidationBuilder* builder) const override; Framework::Text getTypeToken() const override; }; class CombinedItemModifier : public ItemModifier { Framework::RCArray modifiers; public: CombinedItemModifier(); void applyOn(Item* zItem) override; void addModifier(ItemModifier* zModifier); const Framework::RCArray& getModifiers() const; }; class CombinedItemModifierFactory : public SubTypeFactory { public: CombinedItemModifierFactory(); CombinedItemModifier* createValue( Framework::JSON::JSONObject* zJson) const override; void fromJson(CombinedItemModifier* zResult, Framework::JSON::JSONObject* zJson) const override; void toJson(CombinedItemModifier* zObject, Framework::JSON::JSONObject* zResult) const override; JSONObjectValidationBuilder* addToValidator( JSONObjectValidationBuilder* builder) const override; Framework::Text getTypeToken() const override; };