%module{Google::ProtocolBuffers::Dynamic};

#include "perl_unpollute.h"
#include "dynamic.h"

%name{Google::ProtocolBuffers::Dynamic} class gpd::Dynamic {
    Dynamic(std::string root_directory = std::string());
    ~Dynamic() %code{% THIS->unref(); %};

    void load_file(const std::string &file)
        %code{% THIS->load_file(aTHX_ *file); %};

    void load_string(const std::string &file, SV *sv)
        %code{% THIS->load_string(aTHX_ *file, sv); %};

    void load_serialized_string(SV *sv)
        %code{% THIS->load_serialized_string(aTHX_ sv); %};

    // options is only useful when testing
    void map_wkts(SV *options = NULL)
        %code{% THIS->map_wkts(aTHX_ gpd::MappingOptions(aTHX_ options)); %};

    void map_message(const std::string &message, const std::string &perl_package, SV *options = NULL)
        %code{% THIS->map_message(aTHX_ *message, *perl_package, gpd::MappingOptions(aTHX_ options)); %};

    void map_enum(const std::string &enum_name, const std::string &perl_package, SV *options = NULL)
        %code{% THIS->map_enum(aTHX_ *enum_name, *perl_package, gpd::MappingOptions(aTHX_ options)); %};

    void map_service(const std::string &service_name, const std::string &perl_package, SV *options = NULL)
        %code{% THIS->map_service(aTHX_ *service_name, *perl_package, gpd::MappingOptions(aTHX_ options)); %};

    void map_package(const std::string &pb_package, const std::string &perl_package, SV *options = NULL)
        %code{% THIS->map_package(aTHX_ *pb_package, *perl_package, gpd::MappingOptions(aTHX_ options)); %};

    void map_package_prefix(const std::string &pb_package, const std::string &perl_package, SV *options = NULL)
        %code{% THIS->map_package_prefix(aTHX_ *pb_package, *perl_package, gpd::MappingOptions(aTHX_ options)); %};

    void map_message_prefix(const std::string &pb_message, const std::string &perl_package_prefix, SV *options = NULL)
        %code{% THIS->map_message_prefix(aTHX_ *pb_message, *perl_package_prefix, gpd::MappingOptions(aTHX_ options)); %};

    void resolve_references();

    static bool is_proto3();
    static bool has_proto3_optional();
};