#include <cppcms/serialization.h>
#include <cppcms/application.h>
#include <cppcms/cache_interface.h>
#include <cppcms/session_interface.h>
#include <iostream>
struct physical {
    int age;
    double height;
};
    std::string name;
    physical parameters;
    {
        a & name & cppcms::as_pod(parameters);
    }
};
    std::string name;
    std::string family;
    std::string occupation;
    std::string martial_state;
    double salary;
    physical parameters;
    std::list<child> children;
    std::vector<std::string> friends;
    {
        a & name & family & occupation & martial_state 
          & salary & cppcms::as_pod(parameters) & children & friends;
    }
};
void init_person(person &john)
{
    john.name = "John";
    john.family = "Jonson";
    john.occupation = "Programmer";
    john.martial_state = "married";
    john.parameters.age = 30;
    john.parameters.height = 1.80;
    john.salary = 1500;
    john.children.push_back(child());
    john.children.back().name = "Tom";
    john.children.back().parameters.age = 5;
    john.children.back().parameters.height = 1.0;
    john.friends.push_back("Gorge");
}
public:
    {
    }
    void main(std::string )
    {
        {
            person me;
            if(session().is_set("me")) {
                session().fetch_data("me",me);
                me.salary += 1;
                session().store_data("me",me);
            }
        }
        {
            person john;
            if(!cache().fetch_data("john",john)) {
                init_person(john);
                cache().store_data("john",john);
            }
        }
    }
};
int main()
{
    { 
        {
            person john;
            init_person(john);
            john.save(a);
        }
        {
            person john;
            john.load(a);
            std::cout << john.name << " " << john.children.front().name << " " << john.friends.front() << std::endl;
        }
    }
    { 
        std::string buffer;
        {
            person john;
            init_person(john);
        }
        {
            person john;
            std::cout << john.name << " " << john.children.front().name << " " << john.friends.front() << std::endl;
        }
    }
    return 0;
}